不确定这个问题之前是否被问过,但它是如何(或是否)保证pthread_cond_wait在之前执行的pthread_cond_signal/broadcast?
如果一个线程pthread_cond_wait在下一个pthread_cond_signal被调用之后调用会发生什么?
信号会丢失吗?
如果pthread_cond_signal是阻塞调用(听起来像,从描述“至少一个线程被唤醒”)处于阻塞状态的互斥锁会发生什么?谢谢您的帮助!
pthread_cond_wait发生在 before 还是 after都没有关系pthread_cond_signal,因为您只pthread_cond_wait在谓词为假时调用,并且在与条件变量关联的互斥锁保持期间,谓词所依赖的状态不能改变。
假设服务员正在做类似的事情:
pthread_mutex_lock(mutex);
while (!predicate(state)) pthread_cond_wait(cond, mutex);
pthread_mutex_unlock(mutex);
Run Code Online (Sandbox Code Playgroud)
为了有理由向条件变量发出信号,执行信号的线程必须对 进行了一些更改state。为了在不调用未定义行为的情况下执行此操作,它必须持有mutex,从而保护state. 然而,这意味着要么在上述代码片段之前state完成更改(在这种情况下永远不会调用,因为现在为真),在调用期间(同时互斥锁未锁定;在这种情况下,更改后的信号将解除等待),或在上述代码片段结束之后(在这种情况下它无关紧要)。pthread_cond_waitpredicate(state)pthread_cond_waitstate