这个问题来自Breaking a condition variable deadlock。许多线程可能正在等待一个条件变量,我需要只发出一个特定的线程说一个线程1并杀死它,因为它是一个死锁场景的参与者。有没有办法让我能够发出很多信号。
会感激一些帮助
谢谢
编辑;尊重Nemo的评论。我明白这是一个坏主意。但是,有没有办法做到这一点
答案 0 :(得分:1)
您可以使用延期取消积分。在你的线程中,使用pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldstate);
(这是默认值,但它绝不会因为明确而受到伤害);然后禁用pthread_setcancelstate
取消,除了条件变量等待你想要取消。确保使用pthread_cleanup_push
设置取消清除处理程序;这对RAII来说不会很好。
现在你可以pthread_cancel你的线程。执行取消清理处理程序,按照与注册相反的顺序,调用TLS数据析构函数,并退出线程(不从条件变量wait返回)。
当然,这是一个相当丑陋的设计。理想情况下,你应该避免死锁;如果那是不可能的,如果是我,我会安排一次只有一个线程阻塞一个cvar,并根据这些cvars构建一个更高级别(显式服务器列表)构造,以便处理多个服务员,同时仍允许线程可单独寻址。
答案 1 :(得分:0)
只需编写代码即可完全满足您的需求。由于条件变量不提供此行为,因此没有捷径。所以就写吧。这没什么难的。例如,您可以设置一个特殊标志,唤醒条件变量上阻塞的所有线程,然后对线程进行编码以检查标志,看看是否应该重新进入休眠状态。