我有下面的代码互斥死锁:需要帮助调试互斥死锁
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
是类成员,并在代码中的任何其他地方不使用。在某些时候,我可以看到一个线程卡住试图锁定已经锁定的互斥锁。
有实时和非实时线程锁定互斥锁。我知道可以优先倒置,但这怎么会导致死锁?
你可以将代码发布到'pthread_mutex_lock(&_ Mutex);'?如果代码没有正确处理锁定,我可以看到发生死锁。 –
是否有可能_Registry.insert()或_Registry.erase()抛出异常?这将使互斥锁被锁定... – Nemo
为什么所有人都喜欢*保留标识符*这么多?您不能使用以下划线和大写字母开头的标识符。 '_Registry'和'_Mutex'被保留用于执行。 –