std::promise
promise 是一个类模板,模板参数便是产出值的类型。同样的,future 也是一个类模板,模板参数是获取的值的类型。
std::promise<_data> data_promise; //创建一个承诺
std::future<_data> data_future = data_promise.get_future(); //得到这个承诺封装好的期望
future 的 get() 方法是阻塞的,直到其他任何人调用了 set_value() 方法,相当于封装了mutex与condition。
std::packaged_task
packaged_task 也是一个类模板。get_future()获取线程返回值。
std::packaged_task<_data()> prepare_data_task([]()->_data{
std::this_thread::sleep_for(std::chrono::seconds(2)); //模拟数据生产过程
return{ 1 };
});
auto data_future = prepare_data_task.get_future(); //获取future
future 的 get() 方法是阻塞的,相当于封装了join。
注意future.get()只能被调用一次,多次调用会触发异常, 如果想要在多个线程中多次获取产出值请查阅 shared_future。
感觉future是用来处理一个生产者与一个消费者的异步操作,不适合多个消费者线程的场景。
std::async
封装一个异步操作,省却了起线程、互斥锁、条件。
std::future<_data> data_future = std::async(std::launch::async, []()->_data{
std::this_thread::sleep_for(std::chrono::seconds(1)); //模拟生产过程
return { 1 };
});