我理解当调用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);
}
我如何改进或有更好的解决方案来做到这一点?
答案 0 :(得分:4)
你拥有的代码是活泼的:如果信号量在你检查它的那一刻和你sem_wait
的那一刻之间变为零,该怎么办?您将处于您想要避免的情况(即信号量阻塞在信号量上)。
您可以使用sem_trywait
代替,当您调用信号量时,如果信号量为零,则不会阻止。
答案 1 :(得分:0)
这样的电话不存在的原因是:没有真正的意义。如果您正在使用多个线程,并且需要执行其他操作,请使用另一个线程。如果您想查看是否可以执行某些操作,请使用sem_trywait().
此外,如果您使用代码将该部分中的线程数限制为一个,那么您在示例中使用信号量的方式似乎更适合于互斥锁。将部分中的线程数量限制为大于1的任何数字并没有真正的好处,因为此时该部分必须是多线程安全的。
信号量在生产者 - 消费者模式中更有用。