std::future 简单来说?

std::future in simple words?

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

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

只需一个带有最少用例的小定义就可以满足我的需求。如果问题太多了,请告诉我,我会收回我的问题。

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

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

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

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

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

虽然该函数是 运行,但我们可以继续 /* do some other stuff */

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

之后存储在 std::future

它也可以通过 std::promisestd::packaged_task.

与线程一起使用,而不是 std::async

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

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

收到此异常而不是数据

总结: std::future 是一个object,用于多线程编程,用于从不同线程接收数据或异常;它是两个线程之间 single-use、one-way 通信通道的一端,另一端是 std::promise object。使用 promise-future 模式,您可以保证您的 inter-thread 通信没有多线程程序特有的常见错误,例如竞争条件或访问已释放的内存,如果线程“与彼此”使用为 single-threaded 程序设计的方法,例如通过引用传递函数(=thread)参数时。