std :: future旋转等待吗?

时间:2017-01-30 20:59:24

标签: c++ c++11 promise future

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

wait()块上调用get()std::future,直到通过异步操作设置结果 - std::promisestd::packaged_task或{ {1}}功能。结果的可用性通过共享状态传递,该状态基本上是一个原子变量:未来等待承诺(或异步任务)将共享状态标记为就绪。此等待和通知通过 futex 系统调用在libstdc ++中实现。假设futexes具有高性能,在未来期望只等待极短时间(大约单微秒)的情况下,似乎可以通过在共享状态上短时间旋转来实现性能提升在继续等待futex之前。

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

std::asyn

所以我的问题更多如下:是否真的有计划实施旋转等待,如果是,那么持续时间将如何决定?另外,这是最终可以通过未来的策略指定的功能类型吗?

1 个答案:

答案 0 :(得分:5)

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

所有C ++的答案是:它是一个实现细节。符合标准的库可能会旋转,也可能不旋转(同样,允许std::mutex::lock()旋转)。是否有一种机制可以指定未来是否以及如何旋转?要查看的地方位于std::experimental::future(即将发布到标准库的完整版本),boost::future(以后可能会进入标准的证明)和hpx::future(性能) - 具有future管理的先进设施的重点图书馆。这些都没有明确说明旋转的机制,也没有在我所知道的会议纪要或ISO CPP邮件列表中进行过讨论。可以肯定地说像get_with_spins函数这样的东西不在管道中。

回答libstdc++(和libc++):他们也不会旋转。除了来自the original patch的TODO之外,看起来没有任何改变这个的计划。我已经在GCC邮件列表中搜索了改变这种行为的提及,但没有找到。在一般情况下进行预睡眠旋转可能会造成伤害(如果get()没有一个值,则会浪费很多CPU周期),因此这里的更改可能会产生负面影响。< / p>

总结一下:实现似乎现在没有转动,似乎没有计划在不久的将来改变行为,但这可能随时改变。