创建 std::thread c++11 时收到的 SIGABRT 信号
SIGABRT signal received when creating a std::thread c++11
>我在类成员方法中创建了一个线程,如下所示:
void MyClass::startThread()
{
T.reset( new std::thread( &MyClass::myThreadMethod, this ) );
}
void MyClass::myThreadMethod()
{
// ...
}
哪里
// In header file
std::unique_ptr<std::thread> T;
当我运行MyClass::startThread()
时,我收到以下内容:
收到的信号:SIGABRT (中止) ...
如果我单步执行代码,它发生在线程构造函数中。
我试图像这样删除unique_ptr
:
void MyClass::startThread()
{
std::thread* T = new std::thread( &MyClass::myThreadMethod, this );
}
同样的事情发生了。我在 Linux/Kubuntu 12.04 上的 NetBeans 7.4 上使用 gcc 4.8.2。
有人知道会发生什么吗?
当std::thread
在没有事先调用std::thread::detach()
或std::thread::join()
的情况下被销毁时,就会发生这种情况。您应该调用两者中的任何一个,调用什么取决于您想要的行为。
void MyClass::startThread() {
T.reset( new std::thread( &MyClass::myThreadMethod, this ) );
T->join(); // Wait for thread to finish
}
或
void MyClass::startThread() {
T.reset( new std::thread( &MyClass::myThreadMethod, this ) );
T->detach(); // Leave thread on its own (do not wait for it to finish)
}
作为旁注,您可以通过使std::thread
本身成为成员来删除对std::unique_ptr
的使用:
class MyClass {
std::thread t;
};
要t
线程分配,您可以构造一个线程并将其移动到t
:
t = std::thread(&MyClass::myThreadMethod, this);
根据马克·加西亚的建议和示例,根据这个问题,我只是将-pthread
作为选项添加到编译器中。
由于未知原因,我的其他项目工作正常,但我相信这是由于 Boost 或 Open CV 必须包含当前测试中缺少的内容。
无论如何,就目前而言,它有效。
谢谢!
相关文章:
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 有可能在信号处理程序中设置promise吗
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- 相机崩溃:带JNI代码的致命信号6(Sigabrt)
- 在SIGABRT c ++信号之后继续运行程序
- SIGABRT(信号6)在使用分治法查找阵列中的多数元素时出错
- 创建 std::thread c++11 时收到的 SIGABRT 信号
- 使用SIGSEGV或SIGABRT信号转储核心并终止进程
- 信号 SIGABRT 即使我在 C++ 中使用 delete[]
- OpenMAX AL在信号6 (SIGABRT)时崩溃.媒体服务器死亡
- 在导致sigabrt的析构函数期间的Boost信号
- 获取信号SIGABRT
- 被信号11(SIGSEGV)和/或6(SIGABRT)杀死