C++ 更改pthread中sem_wait的阻塞行为

C++ 更改pthread中sem_wait的阻塞行为,c++,multithreading,pthreads,semaphore,C++,Multithreading,Pthreads,Semaphore,我知道当调用sem\u 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,&ba

我知道当调用
sem\u 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);
}

如何改进或有更好的解决方案吗?

您拥有的代码很活泼:如果在您检查信号量和执行
sem\u wait
之间信号量变为零,该怎么办?您将处于希望避免的情况(即信号量上的线程阻塞)


您可以改为使用,当您调用它时,如果信号量为零,它将不会阻塞。

这样的调用不存在是有原因的:没有真正的意义。如果您正在使用多个线程,并且需要执行其他操作,请使用另一个线程。如果你想看看你是否能做点什么,使用
sem\u trywait()。

另外,如果您使用代码将部分中的线程数限制为一个,那么您在示例中使用信号量的方式似乎更适合于互斥。将节中的线程数限制为大于1的任何数目都没有实际好处,因为在这一点上,节必须是多线程安全的


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

如果您解释为什么要这样做,可能有人能够提供更好的解决方案。Yoyu无法更改系统调用的语义,特别是那些在30年前定义的系统调用。