启动线程导致abort()

时间:2015-04-11 10:48:34

标签: 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()消息(应用程序崩溃),我无法弄清楚为什么会这样。线程中使用的所有对象都是在循环开始之前设置的,所以我不认为这是问题所在。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您的应用已终止,因为std::thread未被.detach.join修改。

~thread();
Destroys the thread object.
If *this has an associated thread (joinable() == true), std::terminate() is called.