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::async
与 std::launch::async
标志异步运行一个函数(这里是一个 lambda)(在另一个线程中)。它 return 是一个 std::future
,它将 最终 ,当该函数完成时,包含一个 int
值。
虽然该函数是 运行,但我们可以继续 /* do some other stuff */
。
当我们需要结果时,我们调用 f.get()
等待直到 int
值可用,这意味着直到异步函数完成,然后将其提供给我们。 f.get()
给我们的值是函数的 return 值,它 std::async
在函数 returned.
之后存储在 std::future
中
它也可以通过 std::promise
或 std::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)参数时。
我在用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::async
与 std::launch::async
标志异步运行一个函数(这里是一个 lambda)(在另一个线程中)。它 return 是一个 std::future
,它将 最终 ,当该函数完成时,包含一个 int
值。
虽然该函数是 运行,但我们可以继续 /* do some other stuff */
。
当我们需要结果时,我们调用 f.get()
等待直到 int
值可用,这意味着直到异步函数完成,然后将其提供给我们。 f.get()
给我们的值是函数的 return 值,它 std::async
在函数 returned.
std::future
中
它也可以通过 std::promise
或 std::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)参数时。