在研究生班,我们不得不使用信号量来完成线程的工作。
我们被指示使用sem_init
以及一堆其他sem_ *程序,但我们没有提供有关这些sem_ *方法的详细信息。
sem_init
的原型(和头文件)是the following:
#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
参数?
sem_init
的GLIBC版本(如果你在Linux上使用man sem_init
,你会得到的)有这样的说法:
“pshared参数指示是否要在进程的线程之间或进程之间共享此信号量。”
所以pshared
是一个布尔值:在实践中传递给它的有意义值是false
(0
)和true
(1
),尽管任何非0值都将被视为真。如果你传递它0,你将获得一个信号量,可以被同一进程中的其他线程访问 - 实质上是进程内锁。您可以将其用作互斥锁,或者您可以更普遍地将其用于信号量的资源计数属性。可以说,如果pthreads支持信号量API,你就不需要sem_init
的这个功能,但Unix中的信号量在pthreads之前需要相当长的时间。
如果布尔值是某种枚举(例如SEM_PROCESS_PRIVATE
vs SEM_PROCESS_SHARED
)会更好,因为那样你就不会有这个问题,但POSIX信号量是一个相当古老的API。
我会说,对于shared
参数,值s 1,2,5等之间没有显着差异。可能它是这样编写的,因为在首次创建API时,C没有布尔类型。
pshared参数指示此信号量是在进程的线程之间还是在进程之间共享。
如果pshared的值为0,则信号量在进程的线程之间共享,并且应该位于所有线程可见的某个地址(例如,全局变量或在堆上动态分配的变量)。
如果pshared为非零,则信号量在进程之间共享,并且应位于共享内存的区域中(请参阅shm_open(3),mmap(2)和shmget(2))。 (由于fork(2)创建的子进程继承了父进程的内存映射,因此它也可以访问信号量。)任何可以访问共享内存区域的进程都可以使用sem_post(3),sem_wait(3)等对信号量进行操作。 。
pshared参数指示是否要在进程的线程之间或进程之间共享此信号量。如果pshared的值为0,则信号量在进程的线程之间共享,并且应位于某个地址,即所有线程都可见。如果pshared非零,那么信号量在进程之间共享,并且应该位于共享内存的区域中。