不确定这个问题之前是否被问过,但它是如何(或是否)保证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
在谓词为 false 时调用,并且在与条件变量关联的互斥锁被保持时,谓词所依赖的状态不会改变。
假设服务员正在做类似的事情:
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