2013-04-07 116 views
1

我来这里问你的意见。 我是一个大项目的新手,所以我会试着描述一下我看到的简单示例。锁定互斥锁的分段错误

顶部回溯是

#0 0xb6adfc6d in pthread_mutex_lock() from /usr/lib/libpthread.so.0 
#1 0x080d8565 in boost::mutex::lock()() 
#2 0x080d8613 in boost::unique_lock<boost::mutex>::lock()() 
#3 0x080d8642 in boost::unique_lock<boost::mutex>::unique_lock(boost::mutex&) 
#4 0x...  in ??? //just ??? in stack 
#5 0x...  in ??? 
#6 0x...  in ??? 

看来互斥体不存在,但它是在类构造器中创建的。 例子:

class A 
{ 
    boost::mutex::scoped_lock mutex_; 
public: 
    A(): mutex_() {} 

    void Read (...) 
    { 
    //some checks 
    boost::mutex::scoped_lock lock(mutex_); // <-- Segfault 
    //read 
    } 

    void Write (...) 
    { 
    //some checks 
    boost::mutex::scoped_lock lock(mutex_); 
    //write 
    } 
}; 

这似乎很奇怪我,因为我不知道该段错误或可能的方式来找到问题的根源的原因。 我很乐意听到您对此的任何建议。

+1

用启用调试信息编译代码(例如GCC和clang的'-g'选项),然后再次运行。你应该希望在回溯中获得更多的信息。 – 2013-04-07 18:31:13

+3

至于崩溃,你确定你在有效的对象上调用'Read'函数吗?即不是你已经删除的对象,或者使用指针/引用从某个函数返回的局部变量?您应该可以提供更多信息,例如如何创建对象或从何处获取对象。 – 2013-04-07 18:32:32

+0

谢谢我会关注这个说结果的人。 – Torrius 2013-04-07 18:57:00

回答

1

它看起来像你的范围锁定范围锁定 - 它可能是一个错字

随机用法示例: http://www.boost.org/doc/libs/1_53_0/libs/thread/example/mutex.cpp

通常的模式是范围互斥,使用的scoped_lock类

boost::recursive_mutex mutex; 
void somefunc() { 
    boost::unique_lock<boost::recursive_mutex> scoped_lock(mutex); 
}