如何检查线程是否持有互斥锁c ++

时间:2012-05-11 20:34:01

标签: c++ multithreading unix

在我的应用程序(C ++ / Linux)中,有时一个线程在取消时获取一个互斥锁(递归)。这会导致死锁,因为其他线程也使用相同的互斥锁而无法获取它。

现在可以检查该线程是否锁定了任何互斥锁。我的动机是手动清除线程锁定然后取消线程。

我能想到的一种可能方法是维持一个反击。任何更好的方法也会受到欢迎..

提前致谢

3 个答案:

答案 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 ++中,在发生故障(抛出)的情况​​下,唯一可以保证执行的是什么?析构函数。

您有两个选择:

  1. 您可以使用C ++ 11或boost lock_guard来封装普通的互斥锁,但提供异常安全性,旨在避免像您这样的问题。但这意味着您需要更改整个应用程序以使用C ++ 11或boost线程,而不是pthread。

  2. 您可以在析构函数中释放互斥锁。

  3. 祝你好运!