2013-04-07 4 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 ??? 

이지만이 클래스의 생성자에서 생성됩니다. 예 : 나는 아무 생각는 segfault 또는 근본 원인을 찾을 수있는 방법의 이유가 없기 때문에

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의 경우 -g 옵션, 예를 들어 clang) 다시 실행하십시오. 해당 백 ​​트레이스에서 더 많은 정보를 얻으실 수 있습니다. –

+3

크래시에 관해서는 유효한 객체에서'Read' 함수를 호출하고 있습니까? 나는. 삭제 한 객체 나 일부 함수에서 반환 된 로컬 변수에 대한 포인터/참조를 사용하지 않습니까? 객체가 어떻게 생성되었는지, 어디에서 가져올 지와 같은 더 많은 정보를 제공해야합니다. –

+0

감사합니다. 결과에 대해이 말에주의를 기울 이겠습니다. – Torrius

답변

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); 
}