创建std :: thread c ++ 11时收到的SIGABRT信号

时间:2014-02-07 04:57:13

标签: c++ multithreading gcc c++11 stl

我在类成员方法中创建一个线程,如下所示:

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。

有人知道会发生什么吗?

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必须包含当前测试中缺少的内容。

无论如何,目前它确实有效。

谢谢!