因此,如果我有一个带有semid
信号量和一个sembuf num_of_sems
的信号量集*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)
联机帮助页依次说
HP-UX semop(2)
联机帮助页更加清晰:
关于c - Semop : When decreasing a set of semaphores are all decremented at once or does it block on first failure?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10206501/