Semop:减less一组信号量时是立即减less还是在第一次失败时阻塞?

所以如果我有一个信号量设置 semidnum_of_sems信号量和sembuf *deleter_searchers_down

 struct sembuf *deleter_searchers_down = malloc(sizeof (*deleter_searchers_down) * num_of_sems); for (i = 0; i < num_of_sems; ++i) { (deleter_searchers_down + i)->sem_op = -1; (deleter_searchers_down + i)->sem_num = i; (deleter_searchers_down + i)->sem_flg = SEM_UNDO; } semop(semid, deleter_searchers_down, num_of_sems); 

对semop的调用将试图一次性降低集合中的所有信号量,或者一旦尝试降低第一个信号量为0并在某个其他进程开始后继续该特定信号量,将会阻塞它。

在所有更新都可以作为一个单元进行之前不会更新。

POSIX规范在这一点上可能会更清楚,尽管它确实说semop是原子的。

在Linux上,glibc中的semop(3)semop(2)的简单封装。 semop(2)页反过来说

包含在sops的操作集合是按照数组的顺序执行的,并且是原子操作的 ,也就是说,操作既可以作为一个完整的单元执行,也可以根本不执行。

HP-UX semop(2)联机帮助页更加清晰:

信号量数组操作是原子的,因为没有任何信号量操作会被执行,直到数组中所有信号量的阻塞条件都被移除。