13

在研究生课程中,我们不得不使用信号量来完成线程工作。

我们被指示sem_init与一堆其他 sem_* 程序一起使用,但我们没有得到关于每个 sem_* 方法的详细信息的太多信息。

原型(和头文件)sem_init如下:

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);

但我不明白 pshared 值的用途。根据opengroup.org

如果pshared参数具有非零值,则信号量在进程之间共享;在这种情况下,任何可以访问信号量的进程都 sem可以sem用于执行 sem_wait()、、、sem_trywait()和操作。sem_post()sem_destroy()

但我想我不明白 1,2、10、25、50000 等之间的区别。我认为这是说如果值为 0 则不共享信号量。(但是,有什么意义呢?)

如何正确使用此pshared参数?

4

4 回答 4

15

GLIBC 版本sem_init(如果你man sem_init在 Linux 上你会得到什么)有这样的说法:

“pshared 参数指示该信号量是在进程的线程之间还是在进程之间共享。”

布尔值也是如此pshared:实际上传递给它的有意义的值是false( 0) 和true( 1),尽管任何非 0 值都将被视为真。如果您将其传递为 0,您将获得一个信号量,该信号量可以被同一进程中的其他线程访问——本质上是一个进程内锁。您可以将其用作互斥体,也可以将其更广泛地用于信号量的资源计数属性。可以说,如果 pthreads 支持信号量 API,您将不需要 的这个特性sem_init,但是 Unix 中的信号量在 pthreads 之前相当长一段时间。

如果布尔值是某种枚举(例如SEM_PROCESS_PRIVATEvs SEM_PROCESS_SHARED)会更好,因为那样你就不会有这个问题,但是 POSIX 信号量是一个相当古老的 API,因为这些事情发生了。

于 2009-08-18T03:22:54.073 回答
2

我会说值 s 1, 2, 5 等相对于shared参数没有显着差异。可能是这样写的,因为在第一次创建 API 时,C 没有布尔类型。

于 2009-08-18T03:22:10.737 回答
1

pshared 参数指示该信号量是在进程的线程之间还是在进程之间共享。

如果 pshared 的值为 0,则信号量在进程的线程之间共享,并且应该位于对所有线程可见的某个地址(例如,全局变量或在堆上动态分配的变量)。

如果 pshared 不为零,则信号量在进程之间共享,并且应该位于共享内存的区域中(请参阅 shm_open(3)、mmap(2) 和 shmget(2))。(由于 fork(2) 创建的子进程继承了父进程的内存映射,它也可以访问信号量。)任何可以访问共享内存区域的进程都可以使用 sem_post(3)、sem_wait(3) 等对信号量进行操作.

于 2015-10-14T12:17:57.630 回答
0

pshared 参数指示此信号量是在进程的线程之间还是在进程之间共享。如果 pshared 的值为 0,则信号量在进程的线程之间共享,并且应该位于某个地址,即对所有线程可见。如果 pshared 不为零,则信号量在进程之间共享,并且应该位于共享内存的区域中。

于 2018-09-13T07:27:27.833 回答