调用std :: async的效率如何?它可以用于在游戏循环中发出任务吗?
我希望我的所有输入检测都在一个单独的线程上并在我的主线程中的游戏循环中的某个点同步,以便我可以轮询输入。
我能想到这样做的唯一方法是分割我的输入检测任务,并在实际游戏循环开始时使用std::async
调用它们,然后在循环中调用wait()
同步数据,但我希望循环的每次迭代都有相同的行为,所以这个调用必须是昂贵的......
那是这样吗?
答案 0 :(得分:3)
至少IMO,你应该在轮询和异步操作之间下定决心。
如果您要进行投票,则使用std::async
是多余的。无论如何,你将从主线程中进行轮询,所以你不妨直接轮询它关心的内容并完成它。使用std::async
启动其他内容只会增加数据到主线程的延迟。
如果你要使用std::async
,那么你应该采取一种截然不同的方法:获得输入的线程独立行动。当他们找到一些输入时,他们将它发送到主线程,并告诉它有一些输入要处理(例如,通过设置信号量)。然后主线程对该信号量作出反应,检索输入数据(例如,从队列中)并处理它。
在后一种情况下,轮询是没有意义的:如果输入线程没有告诉主线程有关某些输入数据,那么根本就没有。在这种情况下,轮询输入数据毫无意义 - 你已经知道没有。
答案 1 :(得分:1)
假设编写得很好,那么std::async(std::launch::async, ...)
应该不比小堆分配更昂贵并构建std::thread
。如果创建一个新的std::thread
来完成这项工作对你来说足够有效,那么std::async
将足够有效,但会省去编写同步以将结果返回主线程的麻烦。 / p>
如果为每项工作创建新的std::thread
是不合适的,那么std::async
可能也不合适。
(N.B。请记住,除非您指定std::launch::async
作为启动策略,否则不能保证任务异步执行,它可能会推迟到您在返回的未来调用get()
之后。)