4

不确定这个问题之前是否被问过,但它是如何(或是否)保证pthread_cond_wait之前执行的pthread_cond_signal/broadcast

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

信号会丢失吗?

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

4

1 回答 1

5

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_waitpredicate(state)pthread_cond_waitstate

于 2013-07-12T04:35:55.463 回答