【问题标题】:cnd_broadcast only wakeup threads who wait before the broadcastcnd_broadcast 只唤醒在广播前等待的线程
【发布时间】:2021-08-09 21:00:09
【问题描述】:

我发现cnd_broadcast 的奇怪行为 我运行 2 个线程,其中一个正忙于做某事。 其中一个正在等待一份新工作。 并且主线程调用cnd_broadcast 通知所有线程没有工作剩余,因此它们可以返回。 然后 main 等待 chid 线程返回thrd_join。 但并非所有子线程都会收到通知。只有在广播前等待的人才能得到通知。 和其他线程卡住等待信号。 这是它应该发生的事情吗?

【问题讨论】:

  • cnd_broadcast 在 cppreference 上被描述为 Unblocks all thread that currently wait on condition variable pointed to by cond
  • hm... 这是预期的行为。那么,如何通知传入的线程?
  • 条件变量有一个关联的互斥锁。您需要使用该互斥锁来正确同步对共享资源的访问。如果不锁定互斥锁,线程甚至不能等待条件变量。
  • cnd_wait 接受 mutex 作为第二个参数。我认为它会自动完成。是吗?

标签: c multithreading thread-safety c11


【解决方案1】:

结果证明了它的预期和记录。 cppreference > cnd_broadcast

【讨论】:

  • 听起来您没有使用关联的互斥体、受互斥体保护的状态以及基于该状态的谓词来决定是否调用cnd_wait。这就是你问题的根源。
  • @R..GitHubSTOPHELPINGICE 感谢您的回复。但是是否允许使用mtx_lock锁定条件变量使用的互斥锁?
  • 我找到了答案。但我还没有找到任何解决方案或替代方案。
  • 是的,为了调用cnd_wait,互斥锁必须被锁定,并且通常在调用cnd_broadcastcnd_signal时应该被锁定,因为你需要修改受互斥体保护的状态,以便有理由发出信号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2020-08-31
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多