C++多线程编程之std::future
1. std::future
std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std::future 对象调用 get(通常在另外一个线程中) 获取该值。如果共享状态的标志不为 还没有被 Provider 设置,则调用 std::future::get() 会阻塞当前的调用者,直到 Provider 设置了共享状态的值,std::future::get() 返回异步任务的值或异常(如果发生了异常)。一句话概括,std::future是为了线程间传递数据使用的。
一共有三种 Provider:
- std::async
- std::promise调用get_future()函数
- std::packaged_task调用get_future()函数
提示,std::future独占资源,类似unique_ptr,不可被拷贝。接下来看下三种 Provider 的用法。
2. std::async
先看一段代码:
#include <iostream>
#include <thread>
#include <future>
#include <chrono>
int main() {
std::future<int> fu = std::async([](int a, int b) {
std::cout << "thread start!" << std::endl;
return a + b;
}, 10, 20);
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
int res = fu.get();
std::cout << "res=" << res << std::endl;
}
编译的时候需要链接pthread库。
运行结果:
运行后立刻出现"thread start!"的字样