在pthread中更改sem_wait上的阻塞行为

时间:2015-04-11 11:17:26

标签: c++ multithreading pthreads semaphore

我理解当调用sem_wait(foo)时,如果 foo 的值为0,则调用者进入阻止状态。

我不想进入阻止状态,而是希望来电者随机休息一段时间。这是我提出的代码。

/* predefined a semaphore foo with initial value of 10 */

void* Queue(void *arg)
{
   int bar;
   int done=0;
   while(done=0)
   {
      sem_getvalue(&foo,&bar);
      if(bar>0){
           sem_wait(&foo);
           /* do sth */
           sem_post(&foo);
           done=1;
      }else{ sleep(rand() % 60); }
   }
   pthread_exit(NULL);
}

我如何改进或有更好的解决方案来做到这一点?

2 个答案:

答案 0 :(得分:4)

你拥有的代码是活泼的:如果信号量在你检查它的那一刻和你sem_wait的那一刻之间变为零,该怎么办?您将处于您想要避免的情况(即信号量阻塞在信号量上)。

您可以使用sem_trywait代替,当您调用信号量时,如果信号量为零,则不会阻止。

答案 1 :(得分:0)

这样的电话不存在的原因是:没有真正的意义。如果您正在使用多个线程,并且需要执行其他操作,请使用另一个线程。如果您想查看是否可以执行某些操作,请使用sem_trywait().

此外,如果您使用代码将该部分中的线程数限制为一个,那么您在示例中使用信号量的方式似乎更适合于互斥锁。将部分中的线程数量限制为大于1的任何数字并没有真正的好处,因为此时该部分必须是多线程安全的。

信号量在生产者 - 消费者模式中更有用。