在研究生课上,我们不得不使用信号量来完成线程的工作。
我们被指示使用sem_init
以及一堆其他sem_ *程序,但我们没有提供有关这些sem_ *方法的详细信息。
sem_init
的原型(和标题文件)是the following:
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
但我不明白pshared值的用途。根据{{3}}:
如果
pshared
参数为非零 值,然后共享信号量 进程之间;在这种情况下,任何 可以访问信号量的进程sem
可以使用sem
进行执行sem_wait()
,sem_trywait()
,sem_post()
, 和sem_destroy()
操作。
但我想我不明白说1,2,10,25,50000等之间的区别。我认为如果值为0则不会分享信号量。 (但那么,有什么意义呢?)
如何正确使用此pshared
参数?
答案 0 :(得分:13)
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这些事情都会发生。
答案 1 :(得分:1)
我想说,对于shared
参数,值s 1,2,5等之间没有显着差异。可能它是这样编写的,因为在首次创建API时,C没有布尔类型。
答案 2 :(得分:1)
pshared参数指示此信号量是在进程的线程之间还是在进程之间共享。
如果pshared的值为0,则信号量在进程的线程之间共享,并且应位于所有线程可见的某个地址(例如,全局变量或在堆上动态分配的变量) )。
如果pshared为非零,则信号量在进程之间共享,并且应位于共享内存的区域中(请参阅shm_open(3),mmap(2)和shmget(2))。 (由于fork(2)创建的子进程继承了父进程的内存映射,因此它也可以访问信号量。)任何可以访问共享内存区域的进程都可以使用sem_post(3),sem_wait(3)等对信号量进行操作。 。
答案 3 :(得分:0)
pshared参数指示此信号量是在进程的线程之间还是在进程之间共享。如果pshared的值为0,则该信号量在进程的线程之间共享。对所有线程可见的地址。如果pshared为非零,则信号在进程之间共享,并且应位于共享内存的区域中。