Semop:当减少一组信号量时,所有信号量都会立即递减或者在第一次失败时是否会阻塞?

时间:2012-04-18 09:23:33

标签: c unix semaphore

因此,如果我的信号量集 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并且在某个特定信号量的其他进程之后继续它会阻塞吗?

1 个答案:

答案 0 :(得分:6)

在所有更新都可以作为一个整体进行之前,不会发生任何更新。

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

在Linux上,glibc中的semop(3)semop(2)的简单包装器。 semop(2)联机帮助页反过来说

  

sops中包含的操作集以数组顺序执行,以原子方式执行,即操作作为完整单元执行,或者根本没有。

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

  

信号量         数组操作是原子的,没有信号量操作         执行直到阻止所有信号量的条件         该数组已被删除。