首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助来调试互斥锁死锁

问需要帮助来调试互斥锁死锁
EN

Stack Overflow用户
提问于 2012-03-07 23:48:43
回答 2查看 2.1K关注 0票数 3

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

代码语言:javascript
复制
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是类成员,不会在代码中的任何其他位置使用。在某些情况下,我可以看到一个线程试图锁定已经锁定的互斥锁。

有实时线程和非实时线程锁定互斥锁。我知道可能会有优先级反转,但这怎么会导致死锁呢?

EN

回答 2

Stack Overflow用户

发布于 2012-03-08 00:00:04

你的代码在我看来完全没问题。您确定在其他地方没有使用_Mutex吗?

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-08 00:15:31

您确定是死锁还是某个线程被其他优先级较高的线程长时间阻塞?

你有没有研究过使用

代码语言:javascript
复制
pthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_INHERIT)

为了避免优先级反转问题?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9604638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档