不确定之前是否曾询问此问题,但pthread_cond_wait
之前pthread_cond_signal/broadcast
是如何(或是否)保证执行的?
如果一个线程在调用后续pthread_cond_wait
后调用pthread_cond_signal
会发生什么?
信号是否会丢失?
如果pthread_cond_signal
是一个阻塞调用(听起来像是从“至少一个线程被唤醒”的描述中),那个阻塞状态的互斥锁会发生什么?谢谢您的帮助!
答案 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
后的信号将取消阻止等待),或者在上面的代码片段结束后(在这种情况下它是无关的)