C++线程冻结程序

Ale*_*epe 0 c++ multithreading

我目前正在开发一个C++游戏,它应该使用多线程来处理僵尸程序实例.Bot类有一个成员函数start(),它在一个新线程中调用bot的函数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();
}
Run Code Online (Sandbox Code Playgroud)

在另一个处理游戏初始化的类中,所有bot实例都是这样开始的:(m_bots是Bots的向量)

void Level::start()
{
    // Start all Bots
    for(auto it: m_bots)
    {
        it->start(*m_physics);
    }
}
Run Code Online (Sandbox Code Playgroud)

启动时,游戏窗口照常打开,但随后继续冻结.控制台输出显示调用了walk()函数.

我错过了什么线程特定的捕获?

我希望这些摘录涵盖所有相关信息.如果不是这样,请告诉我!

Pet*_*ker 6

加入线程阻塞直到线程完成.因此,Bot::start在它生成的线程完成之前不会返回,因此一次只能运行一个线程.

有人可能会告诉你解决方案是join()改为detach().这不是真正的解决方案,除非你的设计需要一堆自由运行的线程; 如果你关心他们什么时候完成,join()就是这样做的方式,就在那里.

一种方法是创建一个类型的对象,std::vector<std::thread>并通过调用启动所有线程Bot::start.线程运行后,您可以加入所有生成的线程.