保证在pthread_wait_signal之前执行pthread_cond_wait

时间:2013-07-12 03:24:01

标签: c++ c pthreads

不确定之前是否曾询问此问题,但pthread_cond_wait之前pthread_cond_signal/broadcast是如何(或是否)保证执行的?

如果一个线程在调用后续pthread_cond_wait后调用pthread_cond_signal会发生什么?

信号是否会丢失?

如果pthread_cond_signal是一个阻塞调用(听起来像是从“至少一个线程被唤醒”的描述中),那个阻塞状态的互斥锁会发生什么?谢谢您的帮助!

1 个答案:

答案 0 :(得分:4)

pthread_cond_wait之前或之后pthread_cond_signal是否发生并不重要,因为您只在谓词为假时调用pthread_cond_wait,并且谓词所依赖的状态不能更改保持与条件变量关联的互斥锁。

假设服务员正在做类似的事情:

pthread_mutex_lock(mutex);
while (!predicate(state)) pthread_cond_wait(cond, mutex);
pthread_mutex_unlock(mutex);

为了有理由通知条件变量,执行信令的线程必须对state进行一些更改。为了在不调用未定义行为的情况下执行此操作,它必须保留mutex,以保护state。但是,这意味着在上面的代码片段之前更改state已完成(在这种情况下pthread_cond_wait永远不会被调用,因为predicate(state)现在是真的),期间对pthread_cond_wait的调用(当互斥锁被解锁时;在这种情况下,更改state后的信号将取消阻止等待),或者在上面的代码片段结束后(在这种情况下它是无关的)