我在类成员方法中创建一个线程,如下所示:
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。
有人知道会发生什么吗?
答案 0 :(得分:13)
如果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::unique_ptr
本身成为会员来移除您对std::thread
的使用:
class MyClass {
std::thread t;
};
要为t
分配一个主题,您可以构建一个并移动将其分配给t
:
t = std::thread(&MyClass::myThreadMethod, this);
答案 1 :(得分:5)
根据Mark Garcia的建议和示例,根据this question我刚刚添加-pthread
作为编译器的选项。
由于未知原因,我的其他项目工作正常,但我认为这是由于Boost或Open CV必须包含当前测试中缺少的内容。
无论如何,目前它确实有效。
谢谢!