我有一个游戏程序,它需要每帧进行大量的AI计算,所以我认为如果我在每一帧中创建数百个线程是一个问题。这是我的解决方案(伪代码,简而言之,因为源代码太长了):
void AIThread(AIAdapter *ai)
{
while (!exit)
{
condition_variable.wait(goThink);
// AI calculation...
ai->Think();
// notify the main thread
mutex.lock();
done++;
mutex.unlock();
condition_variable.notify(doneOne);
}
}
// Invoke it per frame
void MainThread()
{
condition_variable.notify(goThink);
while(done<taskCount)
condition_variable.wait(doneOne);
Update();
}
以下是问题:当最后一次AIThread完成时,它会通知MainThread并中断while循环并继续执行继续执行到下一个condition_variable.notify(goThink);
。现在最后一个AIThread仍然留在if (!exit) goto Ready;
并且没有收到通知并永远留在condition_variable.wait(goThink);
。并且MainThread将永远保持while(done<taskCount)
。我该怎么办?如何编写正确的代码?