C++线程冻结程序
C++ threads freeze program
我目前正在C++开发一款游戏,该游戏应该使用多线程来处理机器人实例。Bot 类有一个成员函数 start((,它在新线程中调用机器人的函数 walk((。这是我的尝试(摘录:(
void Bot::walk(Physics& physics)
{
// do stuff
std::cout << "call to walk() function" << std::endl;
}
void Bot::start(Physics& physics)
{
std::thread m_thread(&Bot::walk, this, std::ref(physics));
m_thread.join();
}
在另一个处理游戏初始化的类中,所有机器人实例都是这样启动的:(m_bots是机器人的向量(
void Level::start()
{
// Start all Bots
for(auto it: m_bots)
{
it->start(*m_physics);
}
}
启动时,游戏窗口照常打开,但随后继续冻结。控制台输出显示调用了 walk(( 函数。
我错过了什么特定于线程的捕获?
我希望这些摘录涵盖所有相关信息。如果不是这种情况,请告诉我!
加入线程会阻塞,直到线程完成。因此,Bot::start
在它生成的线程完成之前不会返回,因此一次只会运行一个线程。
有人可能会告诉您,解决方案是将join()
更改为detach()
。这不是真正的解决方案,除非您的设计需要一堆自由运行的线程;如果你关心他们什么时候完成,join()
就是这样做的方法,只是不存在。
一种方法是创建一个 std::vector<std::thread>
类型的对象,并通过调用 Bot::start
启动所有线程。线程运行后,您可以加入所有生成的线程。
相关文章:
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 程序在对mouse_event的 Windows API 调用中冻结
- C++(SFML?激活某些内容x秒钟,而不会冻结整个程序
- 并行 Python-C++ 程序冻结(内存?
- QT应用程序冻结
- 如何提高四叉树代码的性能以防止程序冻结
- 使用 cin 读取大型输入时程序冻结
- 在C++中读取文件时应用程序冻结
- 由于函数阻止程序执行而导致程序冻结
- 调用删除会导致程序冻结C++
- SRAND 导致我的程序冻结
- 视觉C++程序冻结深奥
- C++程序冻结和UI变为全白
- 程序冻结/循环
- 函数调用会导致C++程序冻结,除非在调试器中逐步执行
- 为什么这个子网类应用程序冻结了
- 当我调用一个函数时,c++列表程序冻结
- Win32 API:打开对话框窗口后应用程序冻结
- 当添加一个用于监听网络的新线程时,应用程序冻结
- 更新CListCtrl时MFC应用程序冻结