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

Mr_*_*s_D 5 c unix semaphore

所以,如果我有一个信号集 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);
Run Code Online (Sandbox Code Playgroud)

对semop的调用将尝试立即降低集合中的所有信号量,或者一旦它试图降低0的第一个信号量并且在某个特定信号量的某些其他进程之后继续,它是否会阻塞?

Gre*_*sev 6

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

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

在Linux上,semop(3)glibc是一个简单的包装器semop(2).该semop(2)联机帮助页反过来说

包含的操作集sops数组顺序执行,并且原子地执行,即,操作作为完整单元执行,或者根本不执行.

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

信号量数组操作是原子的,因为在删除数组中所有信号量的阻塞条件之前,不会执行任何信号量操作.