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 线程分段错误的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 分配导致 std::thread::join 中的段错误
C++ 11 Boost 1.65 recursive_directory_iterator 给出分段错误错误