- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们在静态类中有几个锁(boost::mutex),但是当程序退出时,pthread_mutex_destroy 在互斥量的析构函数中失败(在 boost 中有一个断言检查这个)。
据我所知,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 类中,我在构造函数、析构函数和锁中打印了 this(0x847840) 的值/解锁功能。
任何关于如何调试它的帮助将不胜感激。
编辑Locks 类继承自 boost::mutex,并导出一个作用域锁(来自内存):
lock_type::scoped_lock getScopedLock() {
return lock_type::scoped_lock( *this );
}
我还尝试将锁添加为成员,而不是从它继承,但行为没有变化。我认为 getScopedLock 函数不会引入任何问题(作用域锁返回 y 值,但由于 RVO 而未创建拷贝),但认为值得一提。用法如下(我们使用的是c++0x):
auto lock = lock_.getScopedLock();
完整的跟踪:
(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
最佳答案
当您解锁
您的互斥锁而不先锁定它时,您通常会遇到此错误。
boost::mutex m;
m.unlock();
我的猜测是你在某处使用了lock
和unlock
成员而不是RAII
,并且您丢失了对 lock
的调用。
请注意,大多数时候您不应该调用lock
和unlock
成员。使用为您调用函数的 scoped_lock
。
struct s
{
void foo()
{
boost::mutex::scoped_lock l(m_mutex);
//do something
}
private:
boost::mutex m_mutex;
};
此外,您提到您继承自 boost::mutex
。这可能会导致问题,因为 boost::mutex
没有虚拟析构函数,因此最好不要这样做。
关于c++ - boost::mutex,pthread_mutex_destroy 失败 - 调试建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7165491/
我在C++程序中使用pthread_mutex_t,如下: class Mutex : public noncopyable { public: Mutex() { p
我正在使用命令“pthread_mutex_destroy(&lock);”。 当我检查返回值时 - 它返回数字 16。 在此命令的手册页中,据说失败时会返回一个非零值,但没有指定的方法来检查它。 如
当我尝试通过 pthread_mutex_destroy(&mutex) 销毁互斥量时,它会间歇性地失败。 如果 pthread_mutex_destroy 失败,我正在做断言。但是与断言相比,我们是
我有一个包含一些逻辑并有一个工作线程的类,有几个函数可以检查到目前为止完成的工作的状态。我将更改包装到内部数据并使用互斥锁进行检查,api 要求有一个信号函数告诉类开始关闭,这意味着不能处理新请求,但
我写了以下最小示例: #include #include #include #define SUCCESS 0 using namespace std; int main() { int
我正在单步执行我们的可执行文件链接到的第三方库中的一些代码,特别是“关闭”代码。我正在向我们的应用程序发送 SIGQUIT,这将关闭第三方对象。 出于某种原因,该库对 pthread_mutex_de
假设我使用 pthread_mutex_t *m = new pthread_mutex_t; pthread_mutex_init(m, NULL); 初始化一个互斥体。然后在我完成并调用 pthr
在退出之前,我按以下顺序从 main() 调用: pthread_cancel() 其他线程使用正在“等待”的 mtx(他们正在等待其他 cond_variable 和 mutex。也许这就是问题所在
在 Linux 上,可以使用 PTHREAD_PROCESS_SHARED 属性在进程之间共享互斥体,然后将其保存在可由许多进程使用的映射文件中。 这是 https://linux.die.net/m
我在调试一段代码时遇到这样的语句: assert(0 == pthread_mutex_destroy(&lock)); 谁能解释一下这句话的解释是什么。 我的理解是,如果 pthread_mutex
我们在静态类中有几个锁(boost::mutex),但是当程序退出时,pthread_mutex_destroy 在互斥量的析构函数中失败(在 boost 中有一个断言检查这个)。 据我所知,pthr
我读到了 APUE 3rd , 11.6.1 Mutexes, 本章有一个关于锁定和解锁互斥锁的例子: struct foo { int f_count; pt
我在互斥锁析构函数中遇到了上述错误。由于错误可能是由于互斥锁在销毁过程中处于锁定状态,所以我创建了一个新的互斥锁类,它继承自 boost:mutex。这是为了确保互斥锁在销毁期间解锁。但是,仍然会出现
我是一名优秀的程序员,十分优秀!