在研究生类中,我们不得不使用信号量来完成线程的工作。
我们被指示将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_PRIVATE
与SEM_PROCESS_SHARED
)会更好,因为那样的话您就不会有这个问题了,但是随着这些事情的进行,POSIX信号灯是一个相当古老的API。
关于multithreading - sem_init(...): What is the pshared parameter for?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1291566/