2013-10-09 2 views
0

을 사용하면 내가 부스트 뮤텍스를 기반으로 잠금 매크로를 실행 (11) 동안, 코드는 다음과 같습니다 : 나는 맥 OS가 clang++ -std=c++11 -stdlib=libc++ lock_raii.cc -lboost_system -lboost_thread를 사용하여 컴파일을분할 오류가 : 부스트 뮤텍스

#include <boost/thread.hpp> 
#include <iostream> 

#define LOCK(x) if(Lock _lock_=x){}else 

class Mutex{ 
public: 
    friend class Lock; 

private: 
    boost::mutex mutex_; 

    void Lock(){ 
     mutex_.lock(); 
    }; 

    void Unlock(){ 
     mutex_.unlock(); 
    }; 
}; 

class Lock{ 
public: 
    Lock(Mutex& mutex):mutex_(mutex){mutex_.Lock();}; 
    ~Lock(){mutex_.Unlock();}; 

    operator bool() const { 
     return false; 
    } 

private: 
    Mutex& mutex_; 
}; 

void wait(int seconds) 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
} 

Mutex mtx; 

void thread() 
{ 
    for (int i = 0; i < 5; ++i) 
    { 
     LOCK(mtx){ 
      wait(1); 
      std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl; 
     } 
    } 
} 

int main() 
{ 
    boost::thread t1(thread); 
    boost::thread t2(thread); 
    t1.join(); 
    t2.join(); 
} 

. 실행하면 Segmentation fault: 11이 있습니다.

무엇이 문제입니까?

+0

디버깅을 시도 했습니까? –

+4

해당 매크로를 사용하지 마십시오. 못 생겼어. – GManNickG

+2

C++ 11은 표준 뮤텍스 및 잠금 구성을 제공합니다. [lock_guard] (http://en.cppreference.com/w/cpp/thread/lock_guard)를 참조하십시오. 매크로 트릭은 영리하지만 좋은 습관은 아닙니다. 간접 및인지 마찰의 또 다른 계층을 추가하여 사실상 이득을 얻지 못합니다. –

답변

3

이 방법이 적어도 의심스럽지 않다는 점을 제외하면 코드에 문제가없는 것 같습니다. Linux의 gcc v4.7.0에는 문제가 없습니다 (세그먼트 화 오류가 없음). 따라서 설정을 제대로 올리거나 어딘가에 버그를 만들 수는 없습니다. 디버거에서 프로그램을 실행하고 문제가 발생한 위치를 확인해야합니다. 이론적으로이 코드 :

if(Lock _lock_=x){}else 

는 다음과 같이 컴파일 할 수있다 :

if(Lock _lock_= Lock(x)){}else 

및 호출 복사의 ctor와 뮤텍스를 두 번 잠금을 해제해야합니다. 이것이 문제가 아닌지 확인하려면 Lock private 클래스의 copy ctor를 작성하십시오.

+0

복사 생성자를 비공개로 만들면'Lock _lock_ = x'가 부적절하고 컴파일되지 않습니다. 간단히 말해서, 디자인이 깨졌습니다. 해결책은 그것을 바꾸는 것입니다. –