有没有一种方法可以检查std :: future状态是否准备就绪,并且可以保证无等待?

Ale*_* A. 5 c++ multithreading c++11 std-future

我知道我可以std::future通过以下方式检查状态:

my_future.wait_for(std::chrono::seconds(0)) == std::future_status::ready

但是根据cppreference.com, std::future::wait_for在某些情况下可能会阻止:

由于调度或资源争用延迟,此功能可能阻塞的时间超过timeout_duration。

还是timeout_duration0 还是这样吗?如果是这样,是否还有另一种以保证免等待的方式查询状态的方法?

Rei*_*ica 5

cppreference中引号只是用来提醒您,此处是OS调度程序的一个因素,并且需要平台资源的其他任务可能正在使用线程从其返回所需的CPU时间wait_for()-不管指定的超时时间为零或不。就这样。从技术上讲,您不能保证在非实时平台上能获得更多收益。因此,C ++标准对此一无所获,但您可以在此处看到其他有趣的内容-参见[futures.unique_future¶21]wait_for()下的段落:

效果:如果共享状态包含一个延迟函数([futures.async]),则没有任何限制,否则,直到共享状态就绪或直到由指定的相对超时([thread.req.timing])rel_­time到期为止,该选项才阻塞 。

这里没有这样提及额外的延迟,但是它确实表示您被阻塞,并且是否依赖于这种阻塞wait_for()是首先执行yield()线程1还是超时超时为零时立即返回仍然取决于实现。另外,对于实现而言,也可能有必要以锁定方式同步对未来状态的访问,这必须在检查是否要立即发生潜在回报之前应用。因此,这里您甚至没有保证锁定自由,更不用说等待自由了

注意,wait_until过去有时间的呼叫也是如此。

timeout_duration为0时是否仍然如此?如果是这样,是否还有另一种以保证免等待的方式查询状态的方法?

因此,是的,wait_free()尽管实施,情况仍然如此。因此,这是最接近等待状态的状态检查方法。


1简单来说,这意味着“释放” CPU,并将您的线程放在调度程序队列的后面,从而给其他线程一些CPU时间。

  • @AlexandreA。如果没有精确的测量,这不是一个容易回答的问题。即使您的“ atomic”为“ is_lock_free()”返回“ true”,处理器上的原子操作也应定时并与给定的std :: future查询实现进行比较。 (2认同)