获取std :: future的状态

Dav*_*own 69 c++ multithreading future c++11

是否可以检查a std::future是否已经完成?据我所知,唯一的方法就是调用wait_for零持续时间并检查状态是否ready存在,但是有更好的方法吗?

Jon*_*ely 70

你是对的,除了wait_until过去的时间打电话(相当于),没有更好的方法.

如果你想要一个更方便的语法,你总是可以写一个小包装器:

template<typename R>
  bool is_ready(std::future<R> const& f)
  { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }
Run Code Online (Sandbox Code Playgroud)

注意,如果函数延迟,则永远不会返回true,因此wait_for在经过一定时间或系统负载较低后可能需要同步运行延迟任务的情况下,最好直接检查.

  • @kynnysmatto,在某些实现中它获取了一个互斥锁以安全地检查未来的状态,所以如果该争用是争用的(因为另一个线程使状态准备好,或者还检查准备就绪)那么它将阻塞,另一个线程可以运行,但是在一个好的实现上,互斥锁不应该被保留超过几个指令,所以甚至不是一个毫秒.GCC当前的实现根本不使用互斥锁,但前一个实现并且使状态准备就绪是通过交换两个指针来完成的,因此互斥锁只会在发生这种情况时非常短暂地锁定. (9认同)
  • 如果已经调用了get或者从未初始化了future,请首先考虑检查valid()以避免运行时错误. (5认同)
  • wait_for(chrono :: seconds(0))是否可以保证立即返回,或者在某些实现中是否可以在几毫秒内产生对线程的控制?这一点非常重要,因为在编写游戏时需要花费几毫秒的时间...... (4认同)
  • 其中很大一部分时间用于获取当前时间。如果您使用 wait_until(chrono::system_clock::time_point::min())`,则不需要当前时间,而且它[更快](https://wandbox.org/permlink/Z1arsDE7eHW9JrqJ)。不过,这种优化是针对 GCC 的,对于 GCC 11,您需要使用 `steady_clock` 而不是 `system_clock`,因为我们即将更改幕后使用的时钟。 (3认同)
  • wait_for不会改变未来,因此可以将参数声明为const。 (2认同)

Ric*_*son 11

std :: future 的工作中有一个is_ready成员函数.与此同时,VC实现有一个_Is_ready()成员.

  • 哈哈,典型的 C++。2014 年,有些事情正在“进行中”,但 2023 年却无处可寻。 (4认同)

Dav*_*eas 7

我的第一个赌注是wait_for用0持续时间调用,并检查结果代码,可以是future_status::ready,future_status::deferred或者future_status::timeout.

cppreference中,他们声称valid() 检查结果是否可用,但标准表示如果引用共享状态valid()将返回,而与该状态是否准备无关.true*this

  • cppreference现已更新,并声明"检查未来是否具有共享状态".(不确定是否要删除第二段或编辑它,所以我不会自己修改它). (6认同)