扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章主要讲解了C++11的future和promise、parkged_task的用法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
十载的太康网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整太康建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“太康网站设计”,“太康网站推广”以来,每个客户项目都认真落实执行。
future 的介绍
A future is an object that can retrieve a value from some provider object or function, properly synchronizing this access if in different threads.
它可以从异步的对象或者函数任务中获取结果,它通常和std::async、promise、packaged_task相互调用。
future对象通常是在valid有效的情况下可以使用,默认的构造函数是valid是false的,所以在使用future时,需要对其对象进行初始化。
future的成员函数
成员函数
future用法
future可以从多线程中获取到相关的结果或者是线程输出的结果。因为线程的输出结果不会马上输出(等待执行完成),所以future会有一个共享的状态用于判断当前future的状态。
future输出结果会有三种状态,类型是std::future_status,它们分别是
其中future获取结果的方式有这几种:get、wait、wait_for。
1、get等待异步操作结束并返回结果;
2、wait只是等待异步操作完成;
3、wait_for是超时等待返回结果。
future和async使用的例子
#include#include #include int main(int argc, char **argv) { std::future_status f_status; auto func = [](int b) -> int{ std::cout << "async thread running...." << std::endl; for (int i = 0; i< b; i++) { ; } return b; }; std::future fut = std::async(std::launch::async, func, 888888888); std::cout << "main thread running ...." << std::endl; std::chrono::milliseconds span(100); //方法一,用于等待异步操作的数据 while(1) { f_status = fut.wait_for(span); if (f_status == std::future_status::ready) { std::cout << "future_status::ready "; break; } else if(f_status == std::future_status::deferred) { std::cout << "future_status::deferred "; } else if(f_status == std::future_status::timeout) { std::cout << "future_status::timeout "; } std::cout << std::endl; std::cout << "................"; std::cout << std::endl; //fut.wait(); //方法二,等待异步线程的数据 } std::cout << "future result " << fut.get() << std::endl; return 0;
编译脚本
cmake_minimum_required(VERSION 2.6) set(src ./async.cpp) set(exe "async") set(CMAKE_CXX_FLAGS -std=c++11) add_executable(${exe} ${src}) target_link_libraries(${exe} -lpthread)
promise
std::promise为获取线程函数中的某个值提供便利,在线程函数中给外面传进来的promise赋值,当线程函数执行完成之后就可以通过promis获取该值了,值得注意的是取值是间接的通过promise内部提供的future来获取的。
promise 成员函数
成员函数
它的基本用法:
std::promisepr; std::thread t([](std::promise & p){ p.set_value_at_thread_exit(9); },std::ref(pr)); std::future f = pr.get_future(); auto r = f.get();
parkaged_task
std::packaged_task
std::packaged_task它包装了一个可调用的目标(如function, lambda expression, bind expression, or another function object),以便异步调用,它和promise在某种程度上有点像,promise保存了一个共享状态的值,而packaged_task保存的是一 个函数。它的基本用法:
std::packaged_tasktask([](){ return 7; }); std::thread t1(std::ref(task)); std::future f1 = task.get_future(); auto r1 = f1.get();
promise和packaged_task与std::future的关系
std::future提供了一个访问异步操作结果的机制,它和线程是一个级别的属于低层 次的对象,在它之上高一层的是std::packaged_task和std::promise,他们内部都有future以便访问异步操作结 果,std::packaged_task包装的是一个异步操作,而std::promise包装的是一个值,都是为了方便异步操作的,因为有时我需要获 取线程中的某个值,这时就用std::promise,而有时我需要获一个异步操作的返回值,这时就用std::packaged_task,说直白点就是promise获取的是执行过程中设置的值,而packaged_task获取的是结果。
看完上述内容,是不是对C++11的future和promise、parkged_task的用法有进一步的了解,如果还想学习更多内容,欢迎关注创新互联行业资讯频道。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流