我有一种情况,线程 1 正在等待一个条件变量 A,它应该被线程 2 唤醒。现在线程 2 正在等待一个条件变量 B,它应该被线程 1 唤醒。在我正在使用的场景中条件变量,我无法避免这样的死锁情况。我检测到循环(死锁)并终止参与死锁的线程之一。
现在,我不确定如何简单地终止一个线程,比如说线程 1,它正在等待一个条件变量。
将不胜感激一些指点。谢谢
我有一种情况,线程 1 正在等待一个条件变量 A,它应该被线程 2 唤醒。现在线程 2 正在等待一个条件变量 B,它应该被线程 1 唤醒。在我正在使用的场景中条件变量,我无法避免这样的死锁情况。我检测到循环(死锁)并终止参与死锁的线程之一。
现在,我不确定如何简单地终止一个线程,比如说线程 1,它正在等待一个条件变量。
将不胜感激一些指点。谢谢
条件变量不像互斥锁。我的意思是它们不仅可以由控制它们的单个线程使用。以这种方式处理保护条件变量的互斥体,但它只锁定了很短的时间,在踢(信号)条件变量后由线程手动解锁,并由等待这种踢的线程自动解锁。
您可以拥有一个完全独立的线程(例如您的死锁检测器,我们将其称为线程 3),只需启动其中一个条件变量,它就会唤醒等待它的线程。
条件变量的通常用例是线程等待启动然后检查以确保您仍然有工作(不要仅仅因为变量被踢就假设有工作)。那是为了处理虚假的唤醒。
一种可能性是设置一个“全局” deadlock_occurred 标志,线程 3 在检测到死锁时设置该标志,然后让线程 3 踢出所有条件变量。
线程 1 和 2 被唤醒后应该做的第一件事是检查该标志并采取适当的措施(可能退出线程)。
如果您构建应用程序以便线程负责自己的生命周期,您会发现您遇到的死锁类型的麻烦要少得多。当线程不处于可以被终止的状态时,从外部杀死线程太容易了。不要误会我的意思,还有其他方法可以处理它(例如使用取消点),但我久经考验的解决方案是迄今为止我发现的最简单的解决方案。