所以,如果我有一个信号集 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);
Run Code Online (Sandbox Code Playgroud)
对semop的调用将尝试立即降低集合中的所有信号量,或者一旦它试图降低0的第一个信号量并且在某个特定信号量的某些其他进程之后继续,它是否会阻塞?
在所有更新都可以作为一个单元进行之前不会发生更新
关于这一点,POSIX规范可能更清楚,尽管它确实说它semop是原子的.
在Linux上,semop(3)glibc是一个简单的包装器semop(2).该semop(2)联机帮助页反过来说
包含的操作集
sops以数组顺序执行,并且原子地执行,即,操作作为完整单元执行,或者根本不执行.
HP-UX semop(2)联机帮助页更加清晰:
信号量数组操作是原子的,因为在删除数组中所有信号量的阻塞条件之前,不会执行任何信号量操作.