sem_init(...): value 参数是干啥用的?

Posted

技术标签:

【中文标题】sem_init(...): value 参数是干啥用的?【英文标题】:sem_init(…): What is the value parameter for?sem_init(...): value 参数是干什么用的? 【发布时间】:2012-02-20 23:14:41 【问题描述】:

在一个类中,我们不得不使用信号量来完成线程工作。 sem_init 的原型(和头文件)如下:

int sem_init(sem_t *sem, int pshared, unsigned int value);

但我不明白 value 变量的用途。根据 opengroup.org:

value 是设置信号量的初始值

“value is a value...”这有什么帮助,它有什么用?

【问题讨论】:

【参考方案1】:

Semaphore 值表示可在线程之间共享的公共资源的数量。如果该值大于 0,则调用 sem_wait 的线程无需等待。它只是将值减 1 并继续访问公共资源。 sem_post 会将资源添加回池中。所以它将值加 1。如果值为 0,那么我们将等到有人完成 sem_post。

【讨论】:

【参考方案2】:

sem_init() 初始化一个指向信号量(第一个参数),用值(最后一个参数),最后我相信这实际上是你问的,int pshared 你可以把它想象成一个标志。如果 pshared == 1 则可以分叉信号量。

编辑:信号量具有 int 值,因为您将使用诸如 sem_wait(sem_t* sem) 之类的函数来递减指向信号量的值。如果是负数,则屏蔽。

【讨论】:

“有价值”是什么意思?这是否意味着它被锁定/解锁?它是否指定了信号量的可能获取次数? 我相信是这个初始值:“sem_wait() 递减(锁定)sem 指向的信号量。如果信号量的值大于零,则递减继续,函数返回,立即。如果信号量当前的值为零,则调用将阻塞,直到可以执行递减(即信号量值上升到零以上)或信号处理程序中断调用。"【参考方案3】:

为了理解“价值”在 sem_init(sem_t *sem, int pshared, unsigned int value)

我认为我们需要将它与我们在代码中使用信号量的方式同步: 当我们想等待信号量时,我们调用sem_wait(&mutex),如果我们想通知让其他线程的sem_wait(&mutex)运行,我们需要调用sem_post(&mutex)。 但问题是如果没有任何其他线程首先调用 sem_post (&mutex)(在系统初始化中),sem_wait (&mutex) 应该做什么?它应该通过还是等待其他线程调用 sem_post(&mutex)? 答案在 sem_init() 中的“值”中。如果它为零,则意味着我们必须等待其他一些线程调用 sem_post() 一次,然后它才能通过。如果是一个,那么第一次调用 sem_wait() 将立即通过,但第二次 sem_wait() 将等待(如果在此期间没有调用 sem_post)。 所以 sem_init() 中的值表示我们可以执行多少次 sem_wait() 而无需真正等待而无需任何 sem_post()。 我们可以将 sem_wait() 视为: /死锁等待值被另一个线程更改为大于 0/

而(值

值--;

并将 sem_post() 视为:

值++;

【讨论】:

以上是关于sem_init(...): value 参数是干啥用的?的主要内容,如果未能解决你的问题,请参考以下文章

Linux C语言编译报错:undefined reference to `sem_init‘(编译时加 -lpthread)

Linux C语言编译报错:undefined reference to `sem_init‘(编译时加 -lpthread)

linux 信号量问题 编译错误 好像不识别sem_t定义的变量

DRF Serializer 的many参数是干嘛的

c语言可变参数是干啥的

SendMessage函数是干啥用的 它都有哪些参数