【发布时间】:2021-12-12 00:28:15
【问题描述】:
如标题所示。我需要的功能涉及在某些条件下终止正在运行的线程。不幸的是,如果所述线程已锁定某个全局互斥锁,则该互斥锁将永远保持锁定,因为我正在使用一个线程尝试获取互斥锁的设计,但它仅在另一个线程完成一些工作后才被释放,这允许另一个线程调用第一个线程以再次重新获取它。由于第一个线程被杀死,互斥锁永远不会解锁,第二个线程被卡住并且无法对其执行任何操作。
我会在线程被杀死后解锁互斥锁(即,从同一线程的新实例中),但显然这是不允许的,并且会导致未定义的行为,因为互斥锁必须从锁定它的同一线程。我能做些什么呢?谢谢。
【问题讨论】:
-
我需要的功能是在某些条件下杀死一个正在运行的线程真的,真的糟糕的想法。您无法知道线程是否还持有您无法控制的锁。
-
如何在线程中捕获kill信号并在处理程序中释放互斥锁?
-
你不能像那样简单地解锁一个锁。那把锁保护了一些东西不被并发访问,你认为你可以在它发生的中间打断这样的东西,解锁锁,一切都会正常工作吗?因此,当被杀死的线程处于
malloc()调用的中间,并且堆被锁定时,您打算如何安全地杀死该线程?你不能。 -
...或重新设计,以便您不需要终止/杀死任何线程,直到操作系统在进程终止时执行它。
-
任何线程都不应该强迫任何其他线程做任何事情(例如,死亡)。线程应该相互合作。如果线程 A 需要线程 B 死掉,那么线程 A 应该要求线程 B 死掉,而线程 B 应该被设计成能够及时响应请求,并干净地终止自己。
标签: c multithreading