C ++线程冻结程序

时间:2018-01-21 17:22:10

标签: 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();
}

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

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

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

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

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

1 个答案:

答案 0 :(得分:6)

加入线程阻塞直到线程结束。结果,Bot::start不会返回,直到它生成的线程结束,因此一次只能运行一个线程。

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

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