helgrind不检测std :: mutex的递归锁定

时间:2014-07-30 08:15:32

标签: c++11 g++ deadlock valgrind

我观察到helgrind在非递归的c ++ 11 std :: mutex上没有检测到递归锁定。但是,在使用pthread_mutex_lock时会检测到该问题。

两个简单的测试用例来证明这个问题:

// Test code: C++11 std::mutex
// helgrind does not detect recursive locking
void test_cpp11()
{
    std::mutex m;
    m.lock();
    m.lock();
}

// pthread-based test code
// helgrind does detect recursive locking
void test_pth()
{
    pthread_mutex_t m;
    pthread_mutex_init(&m, 0);
    pthread_mutex_lock(&m);
    pthread_mutex_lock(&m);
}

gdb显示正在调用相同的pthread库函数:

#0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
#1  0x00007ffff78c2657 in _L_lock_909 () from /lib/x86_64-linux-gnu/libpthread.so.0
#2  0x00007ffff78c2480 in __GI___pthread_mutex_lock (mutex=0x7fffffffe450) at ../nptl/pthread_mutex_lock.c:79
#3  0x00000000004008ad in test_pth() ()

#1  0x00007ffff78c2657 in _L_lock_909 () from /lib/x86_64-linux-gnu/libpthread.so.0
#2  0x00007ffff78c2480 in __GI___pthread_mutex_lock (mutex=0x7fffffffe450) at ../nptl/pthread_mutex_lock.c:79
#3  0x00000000004007f7 in __gthread_mutex_lock(pthread_mutex_t*) ()
#4  0x00000000004008ec in std::mutex::lock() ()
#5  0x0000000000400857 in test_cpp11() ()

在Ubuntu 14.04 64位上用g ++ 4.7.3,4.8.2和4.9.0观察到这一点。

有没有人知道可能是什么原因以及如何让helgrind检测递归锁定?

1 个答案:

答案 0 :(得分:1)

不是原始问题的答案,但我认为值得一提的是,应始终使用helgrind drd来检查程序。 drd工具在两种情况下都成功检测到了问题。