我有两个信号量应该原子地改变。
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()
。
我在这个问题中读到,如果两个信号量同时更改,并且如果有一个信号量被阻塞,那么它并不会真正改变另一个信号量 - 并且所有信号量都将进入睡眠状态。
在我的实施中,对我来说非常重要的是:
- 两个信号量的操作都将原子地发生
- 如果第二个信号量将被阻塞,则对第一个信号量无关紧要。意味着第一个信号量将按
signal()
预期进行,第二个信号量将wait()
...
我无法从附加的问题中理解是否可以这样做,而且我不确定那里是否有答案......
所以想问问有没有可能
提前谢谢