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

时间:2012-02-20 23:14:42

标签: multithreading semaphore

在课堂上,我们必须使用信号量来完成线程的工作。 sem_init的原型(和头文件)如下:

  

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

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

  

value是将信号量设置为

的初始值

“价值是一个价值......”这有什么帮助,它用于什么?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

为了理解“价值” 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()中的“value”中。如果它为零,则意味着我们必须等待一些其他线程调用sem_post()一次,然后才能通过。如果它是1,那么第一次调用sem_wait()将立即传递,但第二次sem_wait()将等待(如果在它们期间没有调用sem_post)。 所以sem_init()中的值表示我们可以执行sem_wait()多少次而没有真正等待没有任何sem_post()。 我们可以将sem_wait()视为: / 死锁等待,直到另一个线程将值更改为大于0 /

while(值< = 0) {}

值 - ;

并将sem_post()视为:

值++;