2014-11-25 5 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().

Почему вызов start_thread() вызывает ошибку сегментации в join()?

Я использую:

г ++ (Ubuntu 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, нет необходимости и не должен запускать его явно. На самом деле, ctor boost::thread звонит start_thread(), start_thread() звонит start_thread_noexcept(), который реализует создание потока на разных платформах, он вызывает pthread_create(), если вы используете pthread, вы можете проверить это из исходного кода boost. Мне интересно, почему эта функция является общедоступной.
Update: только что проверил новую версию наддува (1.57), эта функция объявлена ​​как частный сейчас, в файле boost/thread/detail/thread.hpp:

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

поэтому он будет не в состоянии собрать, если вы хотите назвать это ,

+0

Правильно, это не публично. –

+0

Я также был озадачен публичной функцией 'start_thread()'. Когда я увидел, что 'start_thread()' был общедоступным, я предположил, что API требует, чтобы вы вызывали 'start_thread()' ->, что привело к тому, что мой код не выглядел красиво, а затем отладчик с трудом показывал мне, как он терпел неудачу. Я, наконец, заметил 2x отпечатков, что привело меня к перечитанию документации и переопределению моего кода, чтобы не называть 'start_thread()'. –

+0

У меня есть 1.54 boost, поэтому с 'start_thread', поскольку функция' public' существует уже давно ... –

 Смежные вопросы

  • Нет связанных вопросов^_^