![](/img/trans.png)
[英]C++11 std::thread join crashes with system_error exception and SIGABRT on Xcode 6?
[英]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::detach()
或std::thread::join()
而销毁std::thread
时会发生这种情况。 你应该调用两者中的任何一个,调用什么取决于你想要的行为。
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);
根据Mark Garcia的建议和示例,根据这个问题,我刚刚添加了-pthread
作为编译器的选项。
由于未知原因,我的其他项目正常工作,但我认为这是由于Boost或Open CV必须包含当前测试中缺少的内容。
无论如何,目前,它的工作原理。
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.