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

我们被指示将sem_init与其他一堆sem_ *过程一起使用,但是我们没有得到关于这些sem_ *方法每种方法的详细信息。
sem_init的原型(prototype)(和头文件)是the following:

#include <semaphore.h>

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

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



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

如何适当使用此pshared参数?

最佳答案

GLIBC版本的sem_init(如果在Linux上为man sem_init,会得到什么)是这样说的:



因此pshared是一个 bool 值:实际上,传递给它的有意义的值是false(0)和true(1),尽管任何非0值都将被视为true。如果将其传递为0,则将获得可以由同一进程中的其他线程访问的信号量-本质上是进程内锁。您可以将其用作互斥体,也可以将其更广泛地用于信号量的资源计数属性。可以说,如果pthread支持信号量API,则不需要sem_init的此功能,但是Unix中的信号量要比pthread早很多时间。

如果 bool 值是某种枚举(例如SEM_PROCESS_PRIVATESEM_PROCESS_SHARED)会更好,因为那样的话您就不会有这个问题了,但是随着这些事情的进行,POSIX信号灯是一个相当古老的API。

关于multithreading - sem_init(...): What is the pshared parameter for?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1291566/

10-09 00:23