1

调用 std::async 的效率如何?它可以用于在游戏循环中发出任务吗?

我希望我的所有输入检测都在一个单独的线程上,并在我的主线程的游戏循环中的某个点同步,以便我可以轮询输入。

我能想到的唯一方法是拆分我的输入检测任务,并std::async在实际游戏循环开始时使用它们调用它们,然后wait()在循环中稍后调用以同步数据,但我希望每次迭代都具有相同的行为循环,所以这个调用一定很昂贵......

是这样吗?

4

2 回答 2

3

至少在 IMO,您应该在轮询和异步操作之间下定决心。

如果您要进行投票,那么使用std::async是多余的。无论如何,您都会从主线程进行轮询,因此您不妨直接让它轮询它关心的内容并完成它。使用std::async启动其他东西只会增加将数据获取到主线程的延迟。

如果您要使用std::async,那么您应该采用一种完全不同的方法:获取输入的线程独立运行。当他们找到一些输入时,他们将其发送到主线程,并告诉它有一些输入要处理(例如,通过设置信号量)。然后主线程对该信号量做出反应,检索输入数据(例如,从队列中)并处理它。

在后一种情况下,轮询是没有意义的:如果输入线程没有告诉主线程一些输入数据,那么根本就没有。在这种情况下,轮询输入数据是没有意义的——你已经知道没有。

于 2012-12-13T04:48:57.843 回答
3

假设它写得很好,那么std::async(std::launch::async, ...)应该不会比一个小的堆分配和构造一个std::thread. 如果创建一个新std::thread的来完成这项工作对您来说足够高效,那么std::async将足够高效,但会省去您编写同步以将结果返回到主线程的麻烦。

如果为每件作品创建一个新std::thread的不合适,那么std::async可能也不合适。

(请记住,除非您指定std::launch::async启动策略,否则不能保证任务异步执行,它可能会被推迟到您调用get()返回的未来。)

于 2012-12-13T14:00:14.527 回答