在join()上提升线程分段错误

时间:2014-11-25 06:03:26

标签: c++ boost boost-thread

我有以下代码:

#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()中的细分错误?

我用:

  

g ++(Ubuntu 4.8.2-19ubuntu1)4.8.2

     

Boost版本:1.54.0.1ubuntu1

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

1 个答案:

答案 0 :(得分:2)

Boost线程在boost::thread的构造函数中执行,没有必要也不应该显式启动它。实际上,boost::thread的调用者调用start_thread()start_thread()调用start_thread_noexcept()来实现在不同平台上创建线程,如果使用pthread_create()则调用pthread 1}},您可以从boost线程的源代码中查看。我想知道为什么这个功能是公开的 更新:刚检出新版本的boost(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());
      }
    }

因此如果要调用它将无法编译。