我在以下代码中有一个互斥锁死锁:

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调试器,可以帮助您消除死锁。也许您可以运行它。

09-26 05:19