[英]Change the blocking behavior on sem_wait in pthread
我了解,当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);
}
我该如何改善或有更好的解决方案来做到这一点?
您拥有的代码很活泼:如果在您检查信号的时刻与执行sem_wait
的时刻之间的信号量达到零,该怎么办? 您将处于要避免的情况(即线程在信号量上阻塞)。
您可以改用sem_trywait
,如果调用时信号量为零,它将不会阻塞。
有一个这样的电话不存在的原因:没有真正的意义。 如果您使用多个线程,并且需要执行其他操作,请使用另一个线程。 如果要查看是否可以执行某些操作,请使用sem_trywait().
另外,如果您使用代码将本节中的线程数限制为一个,则在示例中使用信号量的方式似乎更适合于互斥量。 而且,将节中的线程数限制为大于一个的任何数目都没有真正的好处,因为那时候该节无论如何必须是多线程安全的。
信号量在生产者-消费者模式中更有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.