アトミックに変更する必要がある 2 つのセマフォがあります。
union semun su;
struct sembuf sb[2];
int num = 2;
semid = semget(num, 3, IPC_CREAT | IPC_EXCL | 0600);
su.val = 1;
semctl(semid, 0, SETVAL, su);
su.val = 0;
semctl(semid, 1, SETVAL, su);
sb[0].sem_num = 0;
sb[0].sem_op = 1; // signal
sb[0].sem_flg = 0;
sb[1].sem_num = 1;
sb[1].sem_op = -1; //wait
sb[1].sem_flg = 0;
semop(semid, sb, 2)
ご覧のとおり、一方のセマフォはsignal()
で、もう一方はwait()
です。
この質問で、両方のセマフォが一度に変更された場合、ブロックされたセマフォが 1 つある場合、もう一方のセマフォは実際には変更されず、すべてのセットがスリープ状態になることを読みました。
私の実装では、次のことが非常に重要です。
- 2 つのセマフォの両方の操作がアトミックに行われます。
- 2 番目のセマフォがブロックされても、最初のセマフォには関係ありません。最初のセマフォは
signal()
想定どおりに動作し、2 番目のセマフォはwait()
...
添付の質問からそれが可能かどうか理解できず、そこに答えがあるかどうかわかりません...
それで、可能かどうか尋ねたかったのです
よろしくお願いします