sem_init(...):什么是pshared参数?

Fra*_*k V 11 multithreading semaphore

在研究生班,我们必须使用信号量来完成线程的工作.

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

原型(和头文件)的sem_init以下:

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);
Run Code Online (Sandbox Code Playgroud)

但我不明白pshared值是用来做什么的.根据opengroup.org:

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

但我想我不明白说1,2,10,25,50000等之间的区别.我认为如果值为0那么信号量就不会被共享.(但那么,重点是什么?)

如何正确使用此pshared参数?

qua*_*ark 13

GLIBC版本sem_init(如果您man sem_init在Linux上获得的话)有这样的说法:

"pshared参数指示是否要在进程的线程之间或进程之间共享此信号量."

所以pshared是一个布尔值:在实践中传递给它的有意义的值是false(0)和true(1),尽管任何非0值都将被视为true.如果你传递它0,你将获得一个信号量,可以被同一进程中的其他线程访问 - 实质上是进程内锁.您可以将其用作互斥锁,或者您可以更普遍地将其用于信号量的资源计数属性.可以说,如果pthreads支持信号量API,你就不需要这个功能了sem_init,但Unix中的信号量在pthreads之前会花费相当多的时间.

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