-1

我在用std::futureC++ 编写的程序中看到了 的用法。所以,我很快就去查找什么是:std::future并得到了一个相当复杂的答案。

有人能用简单的话来形容一个 6 岁的孩子吗?我有一个6岁孩子的理解水平......

一个带有最小用例的小定义对我有用。如果问得太多,请告诉我,我会收回我的问题。

4

3 回答 3

3

Astd::future<T>是 [可能] 尚未计算的工作结果的句柄。你可以把它想象成你找工作时得到的收据,收据是用来取回结果的。例如,您可以将自行车带到自行车商店进行维修。你会得到一张收据来取回你的自行车。在工作进行时(正在修理的自行车),您可以从事其他业务。最终,当工作应该完成时,你会询问结果(修理好的自行车),然后 [可能] 等到结果交付。

std::future<T>是接收结果的一般机制。它没有规定如何实际执行请求的工作。

于 2021-12-28T15:57:42.803 回答
3

您链接的 cppreference 页面上有一个非常简单的示例。稍作修改:

std::future<int> f = std::async(std::launch::async, []{
    // long calculation
    return /* some result */;
});
/* do some other stuff */
int result = f.get();

std::async使用std::launch::async标志异步运行一个函数(这里是一个 lambda)(在另一个线程中)。它返回 a ,当该函数完成时std::future,它最终int将包含一个值。

当该函数运行时,我们可以继续/* do some other stuff */.

当我们需要结果时,我们调用f.get()which 等到int值可用,这意味着直到异步函数完成,然后将其提供给我们。给我们的值f.get()是函数的返回值,它std::async存储在std::future函数返回之后。

代替std::async它也可以通过std::promise或与线程一起使用std::packaged_task

于 2021-12-28T16:04:33.633 回答
1

std::future仅在多线程程序中使用。这样的程序使用线程来执行某些任务,线程可以被认为是相互独立的子程序。对于一个 6 岁的孩子来说,这就像几个人独立做某事来完成某项任务,例如妈妈买票,而爸爸订了旅馆。现在,这些“线程”、“工作者”、“子程序”需要进行通信以安全地共享/传输一些数据。问题在于,由于它们是完全独立的,因此需要一种机制,信息的“生产者”可以通过该机制将其发送给“消费者”或传达其未能生成数据的信息。同样,“消费者”或“接收者”必须有一种安全、可靠的方式来判断 a) 来自另一个线程的数据是否已准备好 b) 接收数据和 c) 如果“生产者”未能产生数据。

提供这种同步机制的一种方法是promise-future对。他们总是成对出现——如果你std::future没有看到std::promise,那是因为后者对你隐藏了,但它在某个地方。std::promise生产者使用它来设置(和“发送”)数据,而std::future“消费者”使用它来接收它。如果生产者不能履行合同,也就是说,如果它不能用数据产生或“满足”承诺,它可能会通过一个异常来满足它,这是一种 C++ 方法来告诉它出了问题。然后,“消费者”将通过其std::future.

综上所述: std::future是多线程编程中用于从不同线程接收数据或异常的对象;它是两个线程之间的一次性、单向通信通道的一端, std::promise对象是另一端。使用 promise-future 模式,您可以保证您的线程间通信不会出现特定于多线程程序的常见错误,例如竞争条件或访问已释放的内存,如果线程“相互交谈”使用为单线程程序设计的方法,例如当函数(=thread)参数通过引用传递时。

于 2021-12-28T16:50:21.830 回答