一:async
std::async:用于创建异步任务,可以代替创建线程,函数原型:
async(std::launch::async | std::launch::deferred, f, args...),第一个参数是创建策略
std::launch::async:立即创建线程
std::launch::deferred:延迟加载方式创建,知道调用future的get或者wait时才创建线程
int fun4(){ cout << "thread id :" << this_thread::get_id() << endl; std::this_thread::sleep_for(std::chrono::seconds(5)); return 1;}std::async(fun4);
二:future
std::future:提供了一种访问异步操作结果机制,从异步任务中获取结果。
获取future结果:
1.future.get(),等待异步执行结束获取返回结果,只能调用一次
2.future.wait(),等待异步执行完成,无返回值。
3.future.wait_for(),超时等待返回结果,返回std::future_status状态
future_status有三种状态:
1.deferred:异步等待状态
2.ready: 异步已完成状态
3.timeout: 异步超时状态
std::future_status status = future.wait_for(std::chrono::seconds(5)); if (status == std::future_status::ready) { std::cout << "task is ready" << endl; } else if(status == std::future_status::timeout) { std::cout << "task is timeout" << endl; } else if (status == std::future_status::deferred) { std::cout << "task is deferred" << endl; }
三:packaged_task
packaged_task可以包装一个可调用的对象,可以通过异步获取调用对象的结果,返回结果传递给关联的std::future对象。
int fun1(int a){ std::this_thread::sleep_for(std::chrono::seconds(5)); return 10*a;}int main(){ //声明一个packaged_task对象 std::packaged_task pt1(fun1); //packaged_task与future关联 std::future fut1 = pt1.get_future(); //创建一线程,把pt1值传入运行 thread t1(std::move(pt1), 10); //阻塞获取执行结果 cout << fut1.get() << endl; //注意只能get获取一次 return 1;}
四:promise
promise可以保存一个值,并可以通过future来读取,比如一个线程把值放入promise中,另一个线程可以通过get_future来获取future,再进行get获取该值。是一种线程同步的手段。
#include #include #include #include //声明一个promise对象,用于存放整形值std::promise prom;int fun1(){ std::this_thread::sleep_for(std::chrono::seconds(5)); prom.set_value(10); return 10;}void fun2(std::future &fut){ cout << "线程1的值:" << fut.get() << endl; return 1;}int main(){ thread t1(fun1); t1.join(); //promise与future关联 std::future fut = prom.get_future(); //引用传递future thread t2(fun2, std::ref(fut)); t2.join(); return 1;}
![2ce6625bdc7b526d748cf68972bfc513.png](https://i-blog.csdnimg.cn/blog_migrate/0f6cad42be791fc372f87895dc0dddd7.jpeg)