【发布时间】:2017-06-09 13:09:47
【问题描述】:
我阅读了一些关于 std::async 的内容,但遗憾的是,我对迄今为止所学和尝试的内容感到有些失望。
现在我“实现”了一个带有后台线程池的小型 std::async 替换器,以尝试我在空闲时间正在开发的游戏。异步替换器既不美观,也不优雅或优化,但如果您将它与 std::launch::async 标志一起使用,它仍然优于 std::async。
代码非常少:
namespace util
{
template <class R, class T> std::future<R> async(const T& task)
{
std::shared_ptr<std::promise<R> > result = std::make_shared<std::promise<R> >();
//threadctrl::run is a call which runs tasks on an engine-global thread pool, which get's injected on initialization
threadctrl::run(std::bind([](std::shared_ptr<std::promise<R> > result, const T& task)->void
{
try
{
result->set_value(task());
}
catch (...)
{
//not handled here
}
}, result, std::ref(task)));
return result->get_future();
}
}
一个简单的用法示例如下所示:
int main()
{
std::future<int> result = util::async<int>(std::bind(give5));
//Do some other work
std::cout << result.get();
return 0;
}
我的问题是:是否有充分的理由在游戏环境中更喜欢原始的 std::async 实现而不是这种方法,或者这样就可以了?
我的最小实现的性能要好得多,我只使用/需要这个非常苗条的接口,因为我不会使用延迟异步,所以对我来说非常方便。
在带有 i5 4570 和 4gb 内存的 windows 7 32 位下,我得到以下结果:
每个 util::async 任务 0.001 毫秒(仅限调度)
每个 std::async 任务 0.006 毫秒(仅限调度)
【问题讨论】:
-
如果你是基于windows的,你知道并发运行时和并行模式库吗?它们提供了该领域 C++ 标准库功能的超集。
-
此外,像这样的微基准数据可能会引起很多怀疑,尤其是在您没有提供用于生成它们的代码的情况下。
-
嗯,我用不同的迷你游戏在游戏过程中调整了日程安排时间。谢谢,我去查图书馆,没听说过... :)
-
但是如果你好奇的话,我尝试了异步计算空间入侵者(比如我正在编码的游戏和侧卷轴射击游戏)中的物理事件(不是因为我认为我会获得很大的提升来自并行性,但为了玩弄它)。这里描述了基本的尝试:mango2go.wordpress.com/2017/05/06/a-simple-collision-approach,只是每个产生的碰撞事件都会启动一个异步任务来计算物理。我添加了一个计数器,并将我在某些游戏过程中通过计数器收集的异步启动所花费的总时间除以。
标签: c++ multithreading c++11 asynchronous