我们在静态类中有几个锁(boost :: mutex),但是当程序退出时,pthread_mutex_destroy在互斥体的析构函数中失败(有一个断言在boost中检查它)。boost :: mutex,pthread_mutex_destroy失败 - 调试建议?
据我所知,pthread_mutex_destroy只会在两种情况下失败。
[EBUSY] The implementation has detected an attempt to destroy the object referenced by mutex while it is locked or referenced (for example, while being used in a pthread_cond_timedwait() or pthread_cond_wait()) by another thread.
[EINVAL] The value specified by mutex is invalid.
当我在GDB中运行并打印锁时,我发现它已解锁。 不幸的是我无法在GDB中打印errno。
#3 0x000000000044a2c6 in ~mutex (this=0x847840, __in_chrg=<value optimized out>) at /usr/include/boost/thread/pthread/mutex.hpp:47
47 BOOST_VERIFY(!pthread_mutex_destroy(&m));
(gdb) p m
$1 = {__data = {__lock = 0, __count = 0, __owner = 0, __nusers = 4294967294, __kind = 0, __spins = 0, __list = {__prev = 0x0,
__next = 0x0}}, __size = '\000' <repeats 12 times>"\376, \377\377\377", '\000' <repeats 23 times>, __align = 0}
现在我写这篇文章__nusers和__size的值看起来很奇怪。这可能暗示该锁无效,但我知道该锁在某个时刻是有效的(我将boost :: mutex包装在一个Lock类中,在该类中我在构造函数,析构函数和锁中打印了此值(0x847840) /解锁功能
任何帮助就如何调试这将不胜感激
编辑 锁类自boost ::互斥继承,并导出一个scopedlock(从内存中):
lock_type::scoped_lock getScopedLock() {
return lock_type::scoped_lock(*this);
}
我也尝试添加锁作为成员,而不是继承从中,没有任何行为改变。 我不认为getScopedLock函数可能会引入任何问题(范围锁定返回y值,但因RVO而不能创建副本),但认为它可能值得一提。 它的用法如下(我们使用的C++ 0x):
auto lock = lock_.getScopedLock();
完整stracktrace:
(gdb) where
#0 0x00007ffff559da75 in *__GI_raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x00007ffff55a15c0 in *__GI_abort() at abort.c:92
#2 0x00007ffff5596941 in *__GI___assert_fail (assertion=0x55851c "!pthread_mutex_destroy(&m)", file=<value optimized out>, line=47,
function=0x5595a0 "boost::mutex::~mutex()") at assert.c:81
#3 0x000000000044a2c6 in ~mutex (this=0x847840, __in_chrg=<value optimized out>) at /usr/include/boost/thread/pthread/mutex.hpp:47
#4 0x000000000044d923 in ~Lock (this=0x847840, __in_chrg=<value optimized out>) at include/Locks.h:43
#5 0x00007ffff55a3262 in __run_exit_handlers (status=0) at exit.c:78
#6 *__GI_exit (status=0) at exit.c:100
#7 0x00000000004ea9a6 in start() at src/main.cc:191
#8 0x00000000004de5aa in main (argc=1, argv=0x7fffffffe7b8) at src/main.cc:90
如果你显示代码会有帮助(例如'Locks.h'中发生了什么) – Tom
发布的代码很少,这是我发布此帖的原因之一,因为我不知道在成千上万行代码中寻找问题。所以很不幸,我也无法制作一个小型测试用例。我甚至不知道哪几个锁正在破坏(我可以通过打印所有锁的地址来初始化它们).Locks类所做的所有工作都是从boost :: mutex atm继承的,它的确如此别的。 – thelamb
@thelamb如果您不能发布复制器,请在valgrind下运行您的代码。 –