繁体   English   中英

创建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::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM