5

因此,如果我有一个带有信号量和sembuf的信号量集 semidnum_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 并在其他进程提升该特定信号量后继续,它会阻塞吗?

4

1 回答 1

6

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

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

在 Linux 上,semop(3)glibc 中是一个简单的semop(2). 手册页反过来semop(2)

中包含的操作集sops数组顺序原子方式执行,也就是说,操作要么作为一个完整的单元执行,要么根本不执行。

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

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

于 2012-04-18T10:09:28.343 回答