如何处理从被终止的线程锁定的全局互斥锁

如标题所示。我需要的功能包括在某些条件下终止正在运行的线程。不幸的是,如果所述线程锁定了某个全局互斥体,则该互斥体将永远保持锁定状态,因为我使用的设计是一个线程尝试获取互斥体,但它只有在从另一个线程执行某些工作后才被释放,这允许第一个线程中的另一个调用再次获取互斥体。由于第一个线程被终止,互斥锁永远不会解锁,第二个线程被卡住,无法对其执行任何操作

我会在线程被终止后解锁互斥锁(也就是说,从同一线程的新实例),但显然这是不允许的,并且会导致未定义的行为,因为互斥锁必须从锁定它的同一线程解锁。我能做些什么?谢谢

我需要的功能包括在某些条件下终止正在运行的线程

线程是一个实现细节。除非有很多代码是无法控制的,否则不可能为了实现功能而杀死线程。如果是这种情况,修复方法是将无法控制的线程隔离到它自己的进程中。您可以安全地终止进程

否则,您无法安全地终止线程。但你不必这么做。你需要做的是阻止线程做你不想做的工作,让它做你想做的工作

您还没有描述线程正在执行的工作或正在使用的线程标准,因此很难为您提供最佳方法的建议。但通常有两种方法:

  1. 拥有一些共享状态,跟踪需要完成的工作。让执行可能需要停止的工作的代码定期检查工作是否应该停止

  2. 使用某种类型的信号方法向正在执行可能需要中断的工作的线程发出信号,表示它正在执行的工作可能不再需要执行。这避免了定期检查的需要,但通常不会避免共享状态的需要

作为最后的手段,只需实现自己的互斥锁,它支持在线程死亡后解锁。这样,线程将只保存支持该功能的互斥体的一个实例。在您的实现中,将有一个受内部互斥体保护的内部布尔值,该互斥体表示持有互斥体。这样,当线程死亡时,您可以获取内部互斥体,清除内部布尔值,然后释放内部互斥体

以下是您的逻辑:

要锁定互斥锁,请执行以下操作:

  1. 获取内部互斥
  2. 当内部布尔值为true时,等待内部条件变量
  3. 将内部布尔值设置为true
  4. 释放内部互斥锁

要解锁互斥锁,请执行以下操作:

  1. 获取内部互斥
  2. 将内部布尔值设置为false
  3. 广播内部条件变量
  4. 释放内部互斥锁

现在,在线程死亡后,您可以调用;“解锁互斥锁”;以上操作。(当然,首先要确保互斥保护的任何状态都是一致的。)

发表评论