我在以下代码中有一个互斥锁死锁:
CRegistry::CRegistry()
{
pthread_mutex_init(&_Mutex, NULL);
}
CRegistry::~CRegistry()
{
pthread_mutex_destroy(&_Mutex);
}
MR_RESULT CRegistry::Register(const REGISTRY_KEY &Id, const REGISTRY_ITEM &Item)
{
pair<REGISTRY::iterator, bool> Result;
pthread_mutex_lock(&_Mutex);
Result = _Registry.insert(pair<REGISTRY_KEY, REGISTRY_ITEM>(Id, Item));
pthread_mutex_unlock(&_Mutex);
if (Result.second == true)
return MR_RESULT_OK;
else
return MR_RESULT_ERROR;
}
MR_RESULT CRegistry::UnRegister(const REGISTRY_KEY &Id)
{
REGISTRY::size_type Result;
pthread_mutex_lock(&_Mutex);
Result = _Registry.erase(Id);
pthread_mutex_unlock(&_Mutex);
if (Result == 1)
return MR_RESULT_OK;
else
return MR_RESULT_ERROR;
}
_Mutext
是类成员,并且在代码中的其他任何地方均未使用。在某个时候,我可以看到一个线程被卡住,试图锁定已经锁定的互斥锁。有实时线程和非实时线程都可以锁定互斥锁。我知道可能会有优先级倒置,但是这怎么会导致死锁呢?
最佳答案
您的代码对我来说似乎很好。您确定_Mutex在其他任何地方都没有使用吗?
Valgrind工具集包括Helgrind,它是一个pthread调试器,可以帮助您消除死锁。也许您可以运行它。