C++线程冻结程序

C++ threads freeze program

本文关键字:程序 冻结 线程 C++      更新时间:2023-10-16

我目前正在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 启动所有线程。线程运行后,您可以加入所有生成的线程。