join() 上的 Boost 线程分段错误

Posted

技术标签:

【中文标题】join() 上的 Boost 线程分段错误【英文标题】:Boost Thread segmentation fault on join() 【发布时间】:2014-11-25 06:03:25 【问题描述】:

我有以下代码:

#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/

【问题讨论】:

SIGSEGV 并不是人们通常期望从如此成熟且广泛使用的库中获得的。 【参考方案1】:

Boost线程在boost::thread的构造函数中执行,不需要也不应该显式启动它。其实boost::thread的ctor调用start_thread()start_thread()调用start_thread_noexcept()实现不同平台的线程创建,如果你使用pthread,它调用pthread_create(),你可以从源代码中查看升压线程。我想知道为什么这个函数是公开的。更新:刚刚检查了新版本的 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());
      
    

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

【讨论】:

公众start_thread()功能也让我感到困惑。当我看到 start_thread() 是公开的时,我认为 API 要求您调用 start_thread() --> 导致我的代码退出得不好,然后调试器无法向我展示它是如何失败的。我终于注意到了 2 倍的打印输出,这导致我重新阅读文档并重新实现我的代码以不调用 start_thread() 我有 1.54 的提升,所以将 start_thread 作为 public 函数已经存在了很长时间......

以上是关于join() 上的 Boost 线程分段错误的主要内容,如果未能解决你的问题,请参考以下文章

线程示例,分段错误

C++ boost线程在实例化两次时导致分段错误

OpenCV 分配导致 std::thread::join 中的段错误

C++ 11 Boost 1.65 recursive_directory_iterator 给出分段错误错误

Boost::python 和 Eigen/dense 创建分段错误

Boost.Asio UDP async_read_from 分段错误