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

SIGABRT signal received when creating a std::thread c++11

本文关键字:SIGABRT 信号 std thread c++11 创建      更新时间:2023-10-16

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

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

无论如何,就目前而言,它有效。

谢谢!