在我的应用程序(C ++ / Linux)中,有时一个线程在取消时获取一个互斥锁(递归)。这会导致死锁,因为其他线程也使用相同的互斥锁而无法获取它。
现在可以检查该线程是否锁定了任何互斥锁。我的动机是手动清除线程锁定然后取消线程。
我能想到的一种可能方法是维持一个反击。任何更好的方法也会受到欢迎..
提前致谢
答案 0 :(得分:4)
许多库提供类似于Windows TryEnterCriticalSection的机制。如果这返回一个表示互斥锁已经出现的信号,那么你就得到了答案。
但是你有一个比这更大的问题。在一个设计合理的多码应用程序中,你永远不会遇到死锁或竞争条件,而且你不必手动插入另一个线程来操纵它的状态。
不应该写一些黑客,而应该修复你的错误。
答案 1 :(得分:1)
通常,您应该避免使用pthread_cancel()
,因为这样的问题。如果必须使用它,则应使用pthread_cleanup_push and pthread_cleanup_pop来保证在线程被取消时互斥锁被解锁。
如果有人叫pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS)
,那么根本无法保证正确执行,所以不要这样做。
pthread_cancel()
非常C-ish。考虑使用Boost's thread interruption,因为您使用C ++进行编程。这将与范围内的锁定对象组合良好。
答案 2 :(得分:0)
正如John所说,主要问题是应用程序设计。
提示:在C ++中,在发生故障(抛出)的情况下,唯一可以保证执行的是什么?析构函数。
您有两个选择:
您可以使用C ++ 11或boost lock_guard来封装普通的互斥锁,但提供异常安全性,旨在避免像您这样的问题。但这意味着您需要更改整个应用程序以使用C ++ 11或boost线程,而不是pthread。
您可以在析构函数中释放互斥锁。