如何在调用pthread_cond_destroy之前发出信号以中止/唤醒所有等待条件变量的线程?

时间:2018-11-29 19:53:45

标签: c++ c++11 pthreads

我知道当有1个以上的线程在等待条件变量时,调用pthread_cond_destroy()时发生不确定的行为,并且我正在寻找一种解决方法,向所有线程发送唤醒信号一个条件变量,然后调用pthread_cond_destroy()。

如果条件变量有效,我的CV类析构函数将调用pthread_cond_destroy()。因此,我想到了:

  1. 在调用pthread_cond_destroy()之前进行广播,但这只会唤醒1个线程。我希望析构函数能够成功执行,并且没有线程应该能够在cv对象上等待(在析构对象上不进行解引用)。

  2. 信号计数(以及变通方法#1)是否可以解决此问题?如果是这样,如何确保在〜CV()成功之前已计划(唤醒)所有等待线程?

  3. 如果使用C ++ 11线程/条件变量,是否可以解决此问题?

1 个答案:

答案 0 :(得分:1)

这就是我的处理方式(假设您要破坏条件变量,因为您正在清理并希望线程退出;如果您不希望线程退出,那么您不应该破坏条件他们正在使用的变量):

  1. 设置一个布尔型标志(或其他内容),指示您希望所有线程都消失
  2. 调用pthread_cond_broadcast()唤醒所有线程(以便他们可以检查该标志,查看其设置并通过干净退出进行响应)
  3. 在每个线程上调用pthread_join(),这样您就知道它们已经全部消失,因此可以安全地继续进行下一步
  4. 调用pthread_cond_destroy()销毁您的条件变量(现在可以安全地进行操作,因为您知道没有线程在使用它,因为它们都在第3步完成之前就退出了)