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 还是这样吗?如果是这样,是否还有另一种以保证免等待的方式查询状态的方法?
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时间。