2012-06-19 4 views
0

나는 boost :: threads로 pantheios 로깅 라이브러리를 사용하는데 약간의 문제가있다. 스레드를 만들기 전에 pantheios 로깅을 사용하면 segfault를 얻게됩니다.Pantheios and boost :: thread

예를 들어, 다음은 작동합니다 :

thread_ = new boost::thread(&foo); 
pantheios::log(pantheios::debug, "Hello world"); 

그러나 문장의 순서가 전환되는 경우, 스택 추적 내가 부스트에 start_thread에 충돌 것을 알 수

.

pantheios::log(pantheios::debug, "Hello world"); 
thread_ = new boost::thread(&foo); 
// SEGFAULT! 

아이디어가 있으십니까?

편집 : 더 컨텍스트

int main() 
{ 
    pantheios::log(...); 
    MyClass myClass(/* some arguments, which are all literals */); 

    // Do some more work 

    return 0; 
} 

// MyClass constructor 
MyClass::MyClass(/* args */) 
    : member1_(arg1) 
    , member2_(arg2) 
{ 
    thread_ = new boost::thread(&MyClass::workerLoop, this); 
} 

// Destructor 
MyClass::~MyClass() 
{ 
    thread_->join(); 
    delete thread_; 
} 

start_thread에서 세그 폴트 것입니다. 다시 한번 내가 두 라인을 main로 바꾸면 문제없이 작동 할 것입니다.

+1

무엇이'foo'입니까? 그것은 어떤 로깅을합니까? 어떤 전역 변수를 사용합니까? –

+0

'foo'는 실제로 클래스의 멤버 함수입니다. boost :: bind를 사용하여 클래스 'this'에 바인딩됩니다. foo는 pantheios도 사용하며 네트워크 소켓을 사용합니다. pantheios하지만 스레드 친화적 인 것으로 간주됩니다 ... –

+0

당신은 포인터를 전달하고있어, '& foo', 그래서 그것은 멤버 함수 또는 boost :: bind'에 의해 반환 된 함수 객체가 될 수 없습니다. 'foo'가 스택에 선언되어 있습니까? 그것은 범위를 벗어나나요? 더 많은 코드를 보여주십시오. –

답변

0

내가 알아 낸 것 같습니다. 다른 버전의 boost에 연결되었습니다. 내 시스템에는 1.40의 부스트 버전이 있었지만, 1.49 버전의 새로운 부스트 버전을 사용하고있었습니다. 주목할만한 것은 이전 버전의 링크였습니다.

일관성을 높이기 위해 링크를 만들었 으면 모든 것이 예상대로 작동했습니다.