【发布时间】:2012-04-18 09:23:33
【问题描述】:
所以,如果我有一个 信号量集 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 的信号量并在其他进程提升该特定信号量后继续执行,它会阻塞吗?
【问题讨论】:
-
好吧,信号量完全按照你说的做,也就是说,当它们降低时,如果它们为 0,它们会阻塞进程。
-
请仔细阅读问题 - semop 会尝试降低所有集合并阻止所有零值,还是会在第一个(第一个?)遇到 0 时阻止
-
您可以指定 IPC_NOWAIT 在失败时立即返回。见:pubs.opengroup.org/onlinepubs/7908799/xsh/semop.html
-
@RedX 链接是相关的,IPC_NOWAIT 不是。问题是是否立即执行数组中不会导致阻塞的操作之一,或者它是否被延迟并且在进程解除阻塞时一次完成所有操作(导致数组中的后续操作之一导致它首先阻止)