【发布时间】:2013-03-01 21:42:11
【问题描述】:
我有两个信号量应该以原子方式更改。
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()。
我在question 中读到,如果同时更改两个信号量,并且如果有一个信号量被阻塞,那么它不会真正改变另一个信号量 - 并且所有信号量都将进入休眠状态.
在我的实现中,对我来说非常重要的是:
- 两个信号量的两个操作都将以原子方式发生
- 如果第二个信号量将被阻止,则对第一个信号量没有影响。意味着第一个信号量将
signal()按原样进行,第二个信号量将wait()...
我无法从附加的问题中理解是否可以这样做,而且我不确定那里是否有答案......
所以想问问有没有可能
先谢谢了
【问题讨论】: