2011-06-16 175 views
2

鉴于典型的例子为条件变量使用互斥作为条件变量

pthread_mutex_lock(&count_mutex); 
pthread_cond_wait(&count_threshold_cv, &count_mutex); 

然后我可以由另一个线程发出一个信号,该螺纹将继续下去。

但我没有看到刚刚尝试锁定互斥锁时出现了什么问题,并且如果执行锁定,则线程将等待互斥锁释放。

这种方法的唯一问题是不断轮询?

感谢

回答

7

让我们来具体说一下。你的建议的替代条件变量是为“服务员”要做到这一点:

loop: 
    lock mutex 
    check predicate 
    if (predicate is false) 
     unlock mutex 
     sleep a bit // (is this what you had in mind?) 
     goto loop 

,并为“信号发生器”要做到这一点:

lock mutex 
    make predicate true 
    unlock mutex 

这里,“谓”可能是”队列不是空的“,例如。

这种方法有两个问题。第一个是你发现的问题:不断的轮询是低效的。如果你想象整个系统中的数百或数千个线程试图以这种方式运行,它会使系统瘫痪。或者你的“睡一会儿”将会持续很长时间,以至于睡眠本身会加重烦人的延迟。

第二个问题更微妙。不能保证当一个线程解锁一个互斥锁并再次锁定它时,另一个等待该互斥锁的线程将被允许运行。 (这个互斥体的属性被称为“公平性”;提供互斥体的互斥体被认为是“公平的”。POSIX不要求要求互斥体公平)无论你在“服务员”中睡了多久不能保证“信号员”有史以来通过其lock mutex通话。

条件变量解决了这两个问题。

0

条件变量信号变为由互斥保护的数据结构。例如。您可能有一个由互斥锁保护的队列,当它变空时,您希望消费者等待条件变量,直到队列不再为空。你想以原子的方式释放互斥体并在那种情况下等待。