gradle task 传递参数_C++11并发编程:async,future,packaged_task,promise

一: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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值