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)