アトミックに変更する必要がある 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()...
添付の質問からそれが可能かどうか理解できず、そこに答えがあるかどうかわかりません...
それで、可能かどうか尋ねたかったのです
よろしくお願いします