2014-11-25 2 views
2

:부스트 스레드 세그먼트 오류()

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

void foo() { 
    puts("foo()"); 
} 

int main() { 
    boost::thread t(foo); 
    //t.start_thread(); 
    puts("join()"); 
    t.join(); 
    return 0; 
} 

그것은 잘 작동하지만 내가 start_thread() 전화의 주석을 때 join()에 반함.

join()start_thread() 호출로 인해 세그먼트가 잘못 생성되는 이유는 무엇입니까?

내가 사용

그램 ++ (우분투 4.8.2-19ubuntu1) 4.8.2

부스트 버전 : 1.54.0.1ubuntu1

g++ -std=c++11 -static main.cpp -lboost_thread -lboost_system -lpthread -L/usr/lib/x86_64-linux-gnu/

+1

SIGSEGV는 일반적으로 그러한 성숙하고 널리 사용되는 라이브러리에서 기대하지 않는 사람입니다. –

답변

2

부스트 스레드 boost::thread의 생성자에서 실행되면 필요가 없으며 명시 적으로 시작하지 않아야합니다. 실제로 boost::thread의 번호는 start_thread(), start_thread()pthread을 사용하는 경우 pthread_create()을 호출하면 다른 플랫폼에서 스레드 생성을 구현하는 start_thread_noexcept()을 호출합니다.이 경우 부스트 스레드의 소스 코드에서 확인할 수 있습니다. 왜이 기능이 공개적인지 궁금합니다.
업데이트가 : 당신이 그것을 호출 할 경우

private: 
    bool start_thread_noexcept(); 
    bool start_thread_noexcept(const attributes& attr); 
//public: 
    void start_thread() 
    { 
     if (!start_thread_noexcept()) 
     { 
     boost::throw_exception(thread_resource_error()); 
     } 
    } 
    void start_thread(const attributes& attr) 
    { 
     if (!start_thread_noexcept(attr)) 
     { 
     boost::throw_exception(thread_resource_error()); 
     } 
    } 

이 때문에 컴파일 할 수 없게됩니다 : 단지 부스트 (1.57)의 새 버전을 체크 아웃이 기능은 파일 boost/thread/detail/thread.hpp에서, 현재 비공개로 선언 .

+0

맞습니다. 더 이상 공개되지 않습니다. –

+0

나는 또한'start_thread()'함수에 당황 스러웠다. 'start_thread()'가 공개 된 것을 보았을 때, 나는 API가 당신에게'start_thread()'를 호출하도록 요구했다 -> 내 코드가 잘 나오지 않아서 디버거가 어떻게 실패했는지 알려주지 못하게했다. 나는 마침내 문서를 다시 읽게하고'start_thread()'를 호출하지 않도록 코드를 재 작성하도록 유도 한 인쇄 출력을 2 배로 알아 챘다. –

+0

나는'public' 함수로'start_thread'를 가지고 오랜 기간 동안 1.54 boost를 가지고 있습니다 ... –