2013-04-07 114 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); 
}