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