Multithreading 检查哪个线程锁定了QMutex
在数据库程序中执行某些操作时,我遇到了一个奇怪的死锁。关键点是线程尝试锁定Multithreading 检查哪个线程锁定了QMutex,multithreading,qt,deadlock,qmutex,Multithreading,Qt,Deadlock,Qmutex,在数据库程序中执行某些操作时,我遇到了一个奇怪的死锁。关键点是线程尝试锁定QMutex时: QMutexLocker locker(&tableMutex_); 这使得程序陷入困境 我很困惑,因为没有其他线程——AFAIK——可以访问这个互斥体。我现在要做的是找出哪个线程锁定了它。我该怎么做呢?在调试器中中断挂起的程序,并检查所有线程的堆栈跟踪。我这样做了,这就是我如何找到它被卡住的地方。但是它可能被锁定在数千行代码中的任何地方。@TomášZato:如果您只使用QMutexLocke
QMutex
时:
QMutexLocker locker(&tableMutex_);
这使得程序陷入困境
我很困惑,因为没有其他线程——AFAIK——可以访问这个互斥体。我现在要做的是找出哪个线程锁定了它。我该怎么做呢?在调试器中中断挂起的程序,并检查所有线程的堆栈跟踪。我这样做了,这就是我如何找到它被卡住的地方。但是它可能被锁定在数千行代码中的任何地方。@TomášZato:如果您只使用
QMutexLocker
或类似的RAII机制锁定互斥体,那么检查其他线程是否在QMutexLocker存在的作用域中应该不会太难。可能同一线程锁定互斥体两次。尝试使用QMutex的递归版本(将QMutex::recursive
传递给QMutex构造函数)