打破条件变量死锁

时间:2011-08-02 03:53:53

标签: c linux condition-variable

我遇到线程1正在等待条件变量A的情况,它应该被线程2唤醒。现在线程2正在等待条件变量B,它应该被线程1唤醒。在场景中我正在使用条件变量,我无法避免这种死锁情况。我检测到循环(死锁)并终止其中一个参与死锁的线程。

现在,我不确定如何简单地终止一个线程,如线程1正在等待一个条件变量。

会感激一些指示。 感谢

1 个答案:

答案 0 :(得分:3)

条件变量不像互斥锁。我的意思是它们不仅可以由控制它们的单个线程使用。保护条件变量的互斥锁被这样处理,但是它只被锁定了很短的时间,在线程(发信号通知)条件变量后由线程手动解锁,并由等待这样一脚的线程自动解锁。

你可以拥有一个完全单独的线程(就像你的死锁检测器一样,让我们​​称之为线程3)只需启动其中一个条件变量,它就会唤醒等待它的线程。

条件变量的通常用例是线程等待踢,然后检查以确保你仍然有工作(不要因为变量被踢了而假设有工作)。这是为了处理虚假的唤醒。

一种可能性是有一个“全局”的deadlock_occurred标志,线程3在检测到死锁时设置,然后还有线程3启动所有条件变量。

线程1和2在被唤醒后应该​​做的第一件事应该是检查该标志并采取适当的行动(可能退出线程)。

如果您构建应用程序以便线程负责自己的生命周期,那么您会发现自己遇到的死锁类型更少。当它们处于不适合被终止的状态时,外部杀死线程太容易了。不要误解我的意思,还有其他方法可以处理它(例如取消点),但我经过试验和测试的解决方案是迄今为止我发现的最简单的解决方案。