gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:28:46 25 4
gpt4 key购买 nike

当有 1 个以上的线程在等待条件变量时,我知道调用 pthread_cond_destroy() 时存在未定义的行为,我正在寻找一个解决方法来向所有正在等待的线程发送唤醒信号调用 pthread_cond_destroy() 之前的条件变量。

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

  1. 在调用 pthread_cond_destroy() 之前进行广播,但这只会唤醒 1 个线程。我希望析构函数成功,并且任何线程都不能等待 cv 对象(不能对已析构的对象取消引用)。

  2. 信号计数(以及解决方法 #1)是解决此问题的方法吗?如果是这样,我如何确保在 ~CV() 成功之前所有等待的线程都已被安排(唤醒)?

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

最佳答案

我会这样做(假设你想破坏条件变量,因为你正在清理并希望线程退出;如果你不希望线程退出,那么你不应该破坏条件他们正在使用的变量):

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

关于c++ - 在调用 pthread_cond_destroy 之前,如何发出信号以中止/唤醒所有等待条件变量的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53546583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com