gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:33 26 4
gpt4 key购买 nike

我在这样的类成员方法中创建了一个线程:

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);

关于c++ - 创建 std::thread c++11 时收到的 SIGABRT 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com