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

问题描述 投票:11回答:4

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

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

multithreading semaphore
4个回答
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
投票

我会说,对于shared参数,值s 1,2,5等之间没有显着差异。可能它是这样编写的,因为在首次创建API时,C没有布尔类型。


1
投票

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

如果pshared的值为0,则信号量在进程的线程之间共享,并且应该位于所有线程可见的某个地址(例如,全局变量或在堆上动态分配的变量)。

如果pshared为非零,则信号量在进程之间共享,并且应位于共享内存的区域中(请参阅shm_open(3),mmap(2)和shmget(2))。 (由于fork(2)创建的子进程继承了父进程的内存映射,因此它也可以访问信号量。)任何可以访问共享内存区域的进程都可以使用sem_post(3),sem_wait(3)等对信号量进行操作。 。


0
投票

pshared参数指示是否要在进程的线程之间或进程之间共享此信号量。如果pshared的值为0,则信号量在进程的线程之间共享,并且应位于某个地址,即所有线程都可见。如果pshared非零,那么信号量在进程之间共享,并且应该位于共享内存的区域中。

© www.soinside.com 2019 - 2024. All rights reserved.