Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cnd_广播仅唤醒在广播之前等待的线程_C_Multithreading_Thread Safety_C11 - Fatal编程技术网

cnd_广播仅唤醒在广播之前等待的线程

cnd_广播仅唤醒在广播之前等待的线程,c,multithreading,thread-safety,c11,C,Multithreading,Thread Safety,C11,我发现了cnd_广播的怪异行为 我运行两个线程,其中一个正在忙着做一些事情。 其中一人正在等待新的工作。 主线程调用cnd_broadcast,通知所有线程没有剩余工作,以便它们可以返回。 然后main等待chid线程返回thrd\u join。 但并非所有子线程都能得到通知。只有在广播前等待的人才能得到通知。 其他线程则一直在等待信号。 这就是它应该发生的吗?证明了它的预期和记录。 cnd\U广播在CPP参考资料中描述为解除阻止当前等待cond所指向的条件变量的所有线程hm。。。这就是预期的行

我发现了cnd_广播的怪异行为 我运行两个线程,其中一个正在忙着做一些事情。 其中一人正在等待新的工作。 主线程调用cnd_broadcast,通知所有线程没有剩余工作,以便它们可以返回。 然后main等待chid线程返回
thrd\u join
。 但并非所有子线程都能得到通知。只有在广播前等待的人才能得到通知。 其他线程则一直在等待信号。
这就是它应该发生的吗?

证明了它的预期和记录。

cnd\U广播
在CPP参考资料中描述为
解除阻止当前等待cond所指向的条件变量的所有线程
hm。。。这就是预期的行为。那么,如何通知传入线程呢?条件变量有一个关联的互斥锁。您需要使用该互斥来正确同步对共享资源的访问。如果不锁定互斥量,线程甚至不能等待条件变量。
cnd_wait
接受互斥量作为第二个参数。我认为它是自动完成的。是吗?听起来好像你没有使用相关的互斥体,受互斥体保护的状态,并对该状态进行谓词,以决定是否调用
cnd\u wait
。这就是您问题的根源。@R..GitHubSTOPHELPINGICE感谢您的回复。但是是否允许使用
mtx\u lock
锁定条件变量使用的互斥锁?我找到了答案。但我还没有找到任何解决方案或替代方案。是的,必须锁定互斥体才能调用
cnd_wait
,通常在调用
cnd_broadcast
cnd_signal
时应该锁定互斥体,因为需要修改互斥体保护状态才能有理由发出信号。