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