c++ - 需要帮助调试互斥锁死锁

标签 c++ linux pthreads mutex deadlock

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

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 调试器。也许你可以运行它。

关于c++ - 需要帮助调试互斥锁死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9604638/

相关文章:

linux - 任务集错误

linux - 链接 `-lpthread` 是否会改变应用程序行为? (Linux, Glibc)

c++ - 我可以同时锁定多个变量吗?

c - 线程试图同时访问同一个变量? C

c++ - 找到所有整数 i, j, k >= 0 使得 i + j + k <= d?

c++ - VC++生成*.dll后*.lib在哪里?

linux - 使用ffplay在特定窗口位置打开视频

c++ - 如何在 *.inl 文件的模板类中定义模板函数

c++ - 正则表达式的歧义可识别标记

mysql - 如何更新可用 MySQL 软件包的 yum 列表?