c++ - 什么时候使用 std::launch::deferred?

标签 c++ multithreading c++11 asynchronous

Anthony William 书中的台词:

std::launch::deferred indicates that the function call is to be deferred until either wait() or get() 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/

相关文章:

c++ - 生产者/消费者,如何确保在关闭所有消费者之前耗尽线程安全队列?

c++ - std::initializer_list 替代方案

c++ - 将第一个元素移动到队列的后面

c++ - 具有相同名称的类 - 是否仅限于同一翻译单元?

c++ - 将单词和数字的文件输入数组 C++

c++ - 性能随着线程数量的增加而降低(无同步)

c++ - IF 语句有奇怪的行为

c++ - 让预定义数量的线程计算更大数量的任务

c++ - VS 2012 中的可变参数模板(Visual C++ 2012 年 11 月 CTP)

c++ - 如何在编译时计算 C++11 中的结构填充?