Anthony William 书中的台词:
std::launch::deferred
indicates that the function call is to be deferred until eitherwait()
orget()
is called on the future.X baz(X&); auto f7 = std::async(std::launch::deferred, baz, std::ref(x)); //run in wait() or get() //... f7.wait(); //invoke deferred function
与直接调用 (baz(ref(x))
) 相比,此代码有何优势或差异?
换句话说, future 在这里有什么意义?
最佳答案
假设您有一个线程池。
线程池拥有一定数量的线程。说 10。
当您添加任务时,它们会返回一个 future,并排入池中。
池中的线程醒来,抓取任务,处理它。
当您在该池中有 10 个任务等待队列中稍后的任务时会发生什么?嗯,一个僵局。
现在,如果我们从这个池中返回一个延迟的 future 会怎样。
当您等待这个延迟的 future 时,它会醒来,检查任务是否完成。如果是,它结束并返回。
接下来,如果任务在队列中但尚未开始,它会从队列中窃取工作并在那里运行,然后返回。
最后,如果它正在被队列运行但还没有完成,它会做一些更复杂的事情。 (通常有效的最简单版本是它阻塞了任务,但这并不能解决某些病态情况)。
无论如何,现在如果队列中的一个任务正在等待队列中另一个尚未排队的任务完成,我们仍然会取得进展。
这个的另一个用途不那么神秘。假设我们有一些惰性值。
我们不计算它们,而是存储带有计算步骤的共享 future 。现在任何需要它们的人只需执行 .get()
。如果这个值已经计算出来了,我们就得到这个值;否则,我们计算它,然后得到它。
稍后,我们添加一个系统来在空闲或另一个线程中做一些工作。这些在某些情况下取代了上述延迟惰性 future ,但在其他情况下则不然。
关于c++ - 什么时候使用 std::launch::deferred?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162693/