在 join() 上提升线程分段错误
Boost Thread segmentation fault on join()
>我有以下一段代码:
#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());
}
}
所以如果你想调用它,它将无法编译。
相关文章:
- 分段故障线程
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 为同一向量C++运行多个线程时出现分段错误
- 线程安全队列出现分段错误
- 多线程中的 std::basicstring 的运行时分段错误C++点燃进程
- 启动线程会导致指针初始化时出现分段错误
- 0MQ:在将上下文传递给线程池时,抛出分段错误
- C++ std 线程并列出分段错误(核心转储)
- std::线程分段错误
- C++ for 循环中的 11 个线程类成员函数会给出分段错误
- 线程连接在另一个线程运行时会导致分段错误
- 多线程程序导致分段错误,使用 std::list::p ush_back
- 多线程环境 (OpenMP) 中的 OpenCV 会导致分段错误
- C++分段错误(核心转储)错误 - 强制转换指针/将函数值返回到线程
- MySQL cppconn 线程分段错误
- 尝试显示线程优先级时出现分段错误
- 线程中的分段错误C++
- 分段错误,使用 pthread_exit() 终止线程时
- 在 join() 上提升线程分段错误
- boost::线程分段错误