2012-03-07 191 views
3

我有下面的代码互斥死锁:需要帮助调试互斥死锁

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是类成员,并在代码中的任何其他地方不使用。在某些时候,我可以看到一个线程卡住试图锁定已经锁定的互斥锁。

有实时和非实时线程锁定互斥锁。我知道可以优先倒置,但这怎么会导致死锁?

+0

你可以将代码发布到'pthread_mutex_lock(&_ Mutex);'?如果代码没有正确处理锁定,我可以看到发生死锁。 –

+1

是否有可能_Registry.insert()或_Registry.erase()抛出异常?这将使互斥锁被锁定... – Nemo

+5

为什么所有人都喜欢*保留标识符*这么多?您不能使用以下划线和大写字母开头的标识符。 '_Registry'和'_Mutex'被保留用于执行。 –

回答

2

你的代码对我来说似乎很完美。你确定_Mutex没有在别的地方使用吗?

Valgrind工具包包括Helgrind,这是一个可帮助您解决死锁的pthread调试程序。也许你可以运行它。

+0

helgrind +1,它帮助我在类似的情况 –

0

您确定存在死锁或仅由其他更高优先级的线程长时间阻塞的线程吗?

你有看着使用

pthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_INHERIT) 

避免优先级反转的问题?