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

Boost Thread segmentation fault on join()

本文关键字:线程 分段 错误 join      更新时间:2023-10-16

>我有以下一段代码:

#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

加速版本:1.54.0.1ubuntu1

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

Boost 线程在 boost::thread 的构造函数中执行,没有必要也不应该显式启动它。实际上,boost::thread调用start_thread()的 ctor ,start_thread()调用start_thread_noexcept(),它实现了在不同平台上创建线程,它会调用pthread_create()如果你使用 pthread,你可以从 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());
      }
    }

所以如果你想调用它,它将无法编译。