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

时间:2009-08-18 02:59:50

标签: multithreading semaphore

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

我们被指示使用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参数?

4 个答案:

答案 0 :(得分:13)

sem_init的GLIBC版本(如果您在Linux上man sem_init得到的话)可以这样说:

  

“pshared参数指示是否存在此信号量   在进程的线程之间或进程之间共享。“

所以pshared是一个布尔值:实际上传递给它的有意义的值是false0)和true1),尽管任何非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为非零,则信号在进程之间共享,并且应位于共享内存的区域中。

相关问题