c++ - 启动线程导致 abort()

标签 c++ multithreading c++11

我正在尝试使用常规 c++11 线程创建一个线程。 我有一个名为 NetworkManager 的对象,它在其构造函数中创建其方法之一的线程,如下所示:

void NetworkManager()
{
    // Raknet setup here...
    std::thread networkUpdate(&NetworkManager::update, this);

    // Set timers
    playerDataTimer.start();
    playerDataTimer.pause();

    Logger::log("NetworkManager constructor ended");
}

更新方法通过 RakNet 库处理来自其他客户端的消息,如下所示:Link

我做了与示例中相同的操作,将其封装在一个永远持续下去的 while 循环中。

当我尝试在构造函数中创建此线程时,我收到 abort() 消息(应用程序崩溃),但我无法弄清楚这是为什么。线程中使用的所有对象都是在循环开始之前设置的,因此我认为这不是问题。

最佳答案

您正在创建的 std::thread 对象会在构造函数末尾被销毁,因为它是一个局部变量。如果destructor当线程可连接时调用 std::thread 的(就像在您的示例中一样),调用 std::terminate

您必须将该线程对象保留为类的成员,或者将其存储在其他位置,或者分离线程。 (或者在你的构造函数中加入它,但这听起来不像你想要的那样。)

关于c++ - 启动线程导致 abort(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29577002/

相关文章:

c++ - 在附加包含目录中使用预处理器定义

c++ - 等待 24 小时的线程的潜在系统成本

java - 如何停止 Java Android 中的线程?

javascript - 我怎么知道我已经达到了 Node 中定义的线程限制?

c++ - 模板类型推导失败?

c++ - 如何将 llvm::MemoryBuffer 的内容作为 std::string 获取?

c++ - 与 MFC 集成的报表生成器

c++ - 将 clang 3.1 与初始值设定项列表结合使用

c++ - std::pair 正在为其成员之一调用默认构造函数

c++ - 如何向 lambda 函数添​​加属性?