因此,如果我的信号量集 semid
包含num_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并且在某个特定信号量的其他进程之后继续它会阻塞吗?
答案 0 :(得分:6)
在所有更新都可以作为一个整体进行之前,不会发生任何更新。
关于这一点,POSIX规范可能更清楚,尽管它确实说semop
是原子的。
在Linux上,glibc中的semop(3)
是semop(2)
的简单包装器。 semop(2)
联机帮助页反过来说
sops
中包含的操作集以数组顺序执行,以原子方式执行,即操作作为完整单元执行,或者根本没有。
HP-UX semop(2)
联机帮助页更加清晰:
信号量 数组操作是原子的,没有信号量操作 执行直到阻止所有信号量的条件 该数组已被删除。