cnd_广播仅唤醒在广播之前等待的线程
我发现了cnd_广播的怪异行为 我运行两个线程,其中一个正在忙着做一些事情。 其中一人正在等待新的工作。 主线程调用cnd_broadcast,通知所有线程没有剩余工作,以便它们可以返回。 然后main等待chid线程返回cnd_广播仅唤醒在广播之前等待的线程,c,multithreading,thread-safety,c11,C,Multithreading,Thread Safety,C11,我发现了cnd_广播的怪异行为 我运行两个线程,其中一个正在忙着做一些事情。 其中一人正在等待新的工作。 主线程调用cnd_broadcast,通知所有线程没有剩余工作,以便它们可以返回。 然后main等待chid线程返回thrd\u join。 但并非所有子线程都能得到通知。只有在广播前等待的人才能得到通知。 其他线程则一直在等待信号。 这就是它应该发生的吗?证明了它的预期和记录。 cnd\U广播在CPP参考资料中描述为解除阻止当前等待cond所指向的条件变量的所有线程hm。。。这就是预期的行
thrd\u join
。
但并非所有子线程都能得到通知。只有在广播前等待的人才能得到通知。
其他线程则一直在等待信号。
这就是它应该发生的吗?证明了它的预期和记录。
cnd\U广播
在CPP参考资料中描述为解除阻止当前等待cond所指向的条件变量的所有线程
hm。。。这就是预期的行为。那么,如何通知传入线程呢?条件变量有一个关联的互斥锁。您需要使用该互斥来正确同步对共享资源的访问。如果不锁定互斥量,线程甚至不能等待条件变量。cnd_wait
接受互斥量作为第二个参数。我认为它是自动完成的。是吗?听起来好像你没有使用相关的互斥体,受互斥体保护的状态,并对该状态进行谓词,以决定是否调用cnd\u wait
。这就是您问题的根源。@R..GitHubSTOPHELPINGICE感谢您的回复。但是是否允许使用mtx\u lock
锁定条件变量使用的互斥锁?我找到了答案。但我还没有找到任何解决方案或替代方案。是的,必须锁定互斥体才能调用cnd_wait
,通常在调用cnd_broadcast
或cnd_signal
时应该锁定互斥体,因为需要修改互斥体保护状态才能有理由发出信号。