以下内容整理自:https://www.cnblogs.com/my_life/articles/5401190.html
future 是一个能从其他地方获取到一个值的对象,如果是在不同的线程中,则被synchronizing properly.
std::condition_variable 可以用于异步事件的重复通知,但是有些时候可能只等待事件发生一次,比如:等待特定的航班,用条件变量大杀器有点浪费了。C++11 标准库提供了几种异步任务机制。通常 thread 不能返回线程执行的结果(可以通过引用参数返回),而在异步处理当中很多时候都需要获得计算的结果。如果只获取结果一次那么选用 future,即通过 future 获取了结果后,后续再通过此 future 获取结果将会出错。
future,async,packaged_task,promise 用法简介:
std::future可用于异步任务中获取任务结果,但是它只是获取结果而已,真正的异步调用需要配合 std::async, std::promise, std::packaged_task。这里 async 是个模板函数,promise 和 packaged_task 是模板类,通常模板实例化参数是任务函数(callable object)。下面是它们的部分组合用法:假设计算任务 int task(string x);
1. async + future简单用法:
代码:
1 // future::operator= 2 #include <iostream> // std::cout 3 #include <future> // std::async, std::future 4 5 int get_value() { return 10; } 6 7 int main () 8 { 9 std::future<int> fut; // default-constructed, 默认构造的 future 对象是无效的 10 11 // async()返回的就是一个 uture 对象。 fut = future_returned_by_async(), 调用 future 的赋值运算符。 12 // move-assigned,赋值运算符隐式使用的是 move 语意(非c++98的拷贝语意), fut = 这使得 fut 变的有效。同时使得右操作数变的无效 13 fut = std::async (get_value); 14 //async创建并运行一个线程,返回一个与函数返回值相对应类型的 future,通过它我们可以在其他任何地方获取异步结果 15 16 //Calling future::get on a valid future blocks the thread until the provider makes the shared state ready return 0; 17 std::cout << "value: " << fut.get() << '\n'; 18 }