Spe*_*nce 5 c++ future promise c++11
在更详细地解释这个问题之前,我会注意到答案显然是依赖于实现的,因此我主要询问libstdc ++,但我也有兴趣了解libc ++.操作系统是Linux.
调用wait()或get()上的std::future块,直到结果由一个异步操作设置-任一种std::promise,std::packaged_task或std::asyn功能.结果的可用性通过共享状态传递,该共享状态基本上是一个原子变量:未来等待承诺(或异步任务)将共享状态标记为就绪.此等待和通知通过futex系统调用在libstdc ++中实现.假设futexes具有高性能,在未来期望只等待极短时间(大约单微秒)的情况下,似乎可以通过在共享状态上短时间旋转来实现性能提升在继续等待futex之前.
我没有在当前的实现中发现任何这种旋转的证据,但是,我确实在161行的atomic_futex.h中找到了一条注释,我希望在那里找到这样的旋转:
// TODO Spin-wait first.
Run Code Online (Sandbox Code Playgroud)
所以我的问题更多如下:是否真的计划实施旋转等待,如果是,那么如何确定持续时间?此外,这是最终可以通过未来政策指定的功能类型吗?
我将回答这个问题:是否std::future::get()进行旋转等待?
所有C++的答案是:它是一个实现细节.符合标准的库可能会旋转,也可能不旋转(以相同的方式,std::mutex::lock()允许旋转).是否有一种机制可以指定未来是否以及如何旋转?需要注意的地方std::experimental::future(很快就会出现标准库的完整版本),boost::future(后来可能会进入标准的试验场)和hpx::future(具有先进future管理功能的以性能为中心的库).这些都没有明确说明旋转的机制,也没有在我所知道的会议纪要或ISO CPP邮件列表中进行过讨论.可以肯定地说,像get_with_spins函数这样的东西不在管道中.
回答libstdc++(和libc++):他们也不旋转.除了来自原始补丁的TODO之外,看起来没有任何改变这个的计划.我已经在GCC邮件列表中搜索了改变这种行为的提及,但没有找到.在一般情况下进行预睡眠旋转可能会受到影响(如果没有get()s值,则浪费了大量的CPU周期),因此这里的更改可能会产生负面影响.
总结一下:实现似乎现在没有转动,似乎没有计划在不久的将来改变行为,但这可能随时改变.
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |