因此,如果我有一个带有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/

10-09 19:53