c++ - std::future 是否旋转等待?

标签 c++ c++11 promise future

在更详细地解释这个问题之前,我会注意到答案显然是依赖于实现的,所以我主要询问的是 libstdc++,但我也有兴趣听听 libc++。操作系统为Linux。

std::future 上调用 wait()get() 会阻塞,直到通过异步操作设置结果 -- std::promisestd::packaged_taskstd::asyn 函数。结果的可用性通过共享状态传达,这基本上是一个原子变量: future 等待共享状态被 promise (或异步任务)标记为就绪。这种等待和通知是通过 futex 系统调用在 libstdc++ 中实现的。假设 futex 是高性能的,在 future 期望只等待极短时间(大约几微秒)的情况下,似乎可以通过在共享状态上旋转短时间来提高性能在继续等待 futex 之前。

我在当前的实现中没有发现任何这种旋转的证据,但是,我确实在 atomic_futex.h at line 161 中找到了评论我希望在哪里找到这样的旋转:

// TODO Spin-wait first.

所以我的问题是:是否真的有实现自旋等待的计划,如果有,持续时间将如何决定?此外,这是最终可以通过 future 政策指定的功能类型吗?

最佳答案

我会回答这个问题:std::future::get() 是否执行自旋等待?

所有 C++ 的答案是:它是一个实现细节。符合规范的标准库可能自旋也可能不自旋(同样,std::mutex::lock() 允许自旋)。将来是否会有一种机制来指定是否以及如何旋转?要看的地方在std::experimental::future (即将推出标准库​​的完整版本),boost::future (为以后可能进入标准的试验场)和 hpx::future (以性能为中心的库,具有用于 future 管理的高级设施)。这些都没有明确指定旋转的机制,据我所知,在 ISO CPP 邮件列表中也没有在 session 记录中进行讨论。可以肯定地说,get_with_spins 函数之类的东西不在管道中。

回答 libstdc++(和 libc++):它们也不自旋。除了来自 the original patch 的 TODO , 看起来没有任何改变这一点的计划。我在 GCC 邮件列表中搜索了更改此行为的提及,但没有找到。在一般情况下进行 sleep 前旋转可能会造成伤害(如果 get() 都没有值,那么您已经浪费了很多 CPU 周期),因此此处的更改可能会产生负面影响影响。

总而言之:实现现在似乎没有旋转,而且似乎没有计划在不久的将来改变行为,但随时可能改变。

关于c++ - std::future 是否旋转等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41945320/

相关文章:

c++ - 在 C++ 中重载增强赋值(返回类型)

javascript - 内部请求失败导致父请求失败

javascript - 为什么我的链式 promise 会阻塞?

android - 如何在Android QT 中播放音频文件?

c++ - 排序可能已经排序的序列——STL::sort efficiency

c++ - std::wistringstream 解析时可以忽略字符串中的空格吗?

c++ - 模板参数的条件数值约束

c++ - C++ 上的 ManualResetEvent(来自 C#)实现 : how to avoid race condition

c++ - 移动没有指针的构造函数

javascript - 将数组与错误合并为单一类型