2017-12-05 7 views
0

すでに定義した共有メモリに書き込むべきプロセスの数が異なります。私はシステムVセマフォを使って試しています。セマフォ(sem_access)は1セマフォを介して共有メモリにアクセスする

sem_access.sem_op = -1; 
    semop(sem_access_id, &sem_access, 1); 

    info->index++; 
    printf ("INDEX= %d\n", info->index); 

    sem_access.sem_op = 1; 
    semop(sem_access_id, &sem_access, 1); 

に初期化される問題が増加せず、常に同じ数、インデックスprintfプリントすることです。 PS:私の悪い英語で申し訳ありませんが、私はスペイン語です。 編集:もし私がsleep(1)を挿入すればうまくいくが、私は本当に睡眠を望んでいない!

+0

'semop()'呼び出しの戻り値は何ですか?あなたはそれを無視している。 –

+0

0を返し、エラーを返しません。 –

答えて

0

コードに関する情報をさらに提供します。あなたはどんな問題を抱えていますか?リソースが獲得されたか待機していなくても、プロセスは停止しますか? semop()

manページは言う:less than zeroある

1)sem_op場合、プロセスは semaphore setに対するALTER権限を持っている必要があります。だからsem_access.sem_op = -1;他のプロセスがこの値を0または0より大きくすると、このプロセスだけが共有リソースにアクセスします。

プロセス1sem_access.sem_op = -1;は//このプロセスは真実ではない状態になるまで待ちます

プロセス2:第一工程でsem_op値が-1であることから、このプロセスは0またはとしてsem_op値を作成する必要があります1その後、唯一の他のプロセスが実行され、そうのsemopのmanページ(としてこの

sem_access.sem_op = 1; 

好きです)と言い、sem_opは正の整数である場合、操作は01を追加してしまいますの値は セマフォ値(semval)になります。今度はsem_opが-1 + 1 = 0になります。semop()マニュアルページ "これは" wait-for-zero "の操作です:semvalがゼロの場合は、すぐに 操作を続行できます。"

問題を解決するためのアイデアがありましたら幸いです。

+0

プロセスは正常に実行されますが、可変インデックスはうまくインクリメントされません。増分の前または後にsleep()を挿入するとうまくいきます。 –

+0

@JimBelushi sleepはスケジューリングのための正しい解決策ではありません。semctl()または手動でsemval値を0にしましたか? – achal

+0

私はそれが正しくないことを知っています!プロセスはセマフォの後にコードを1つずつ実行するため、セマフォは正しく動作しますが、可変インデックスは正しく更新されません –

関連する問題