
(C++11/14/17学习笔记):async、future、packaged_task、promise
发布日期:2021-05-07 15:19:53
浏览次数:19
分类:精选文章
本文共 2882 字,大约阅读时间需要 9 分钟。
async、future、packaged_task、promise
std::async与std::future创建后台任务并返回值
std::async是一个函数模板,用于启动一个异步任务。启动一个异步任务后,它会返回一个std::future对象。std::future是一个类模板,用于访问异步操作的结果。通过调用future的成员函数get()可以获取结果。get()函数是获取结果的唯一方式,不能重复调用。wait()函数用于等待线程返回,但本身并不返回结果。
使用类成员函数作为线程入口函数
类成员函数可以作为线程入口函数。通过将对象引用传递给async()函数,可以确保线程能够正确使用对象成员函数。例如,以下代码创建一个线程,并通过future对象获取结果:
#include#include #include #include #include #include
#include using namespace std;class A {public: int a_thread(int var) { cout << var << endl; cout << "mythread start" << "ThreadId = " << this_thread::get_id() << endl; chrono::milliseconds dura(5000); this_thread::sleep_for(dura); cout << "mythread end" << "ThreadId = " << this_thread::get_id() << endl; return 100; }};int main() { A a; int tmp = 666; future ret = async(&A::a_thread, a, tmp); cout << ret.get() << endl; cout << "主线程结束" << endl; return 0;}
std::launch::deferred与std::launch::async
std::launch::deferred表示线程入口函数调用被延迟到future的wait()或get()调用时才执行。如果wait()或get()没有被调用,线程不会执行。std::launch::async表示线程入口函数调用立即执行。
std::packaged_task的使用
std::packaged_task是一个类模板,用于包装可调用对象。通过std::packaged_task可以将各种可调用对象(如函数、lambda表达式或成员函数)包装起来,并作为线程入口函数调用。例如:
#include#include #include #include #include #include
#include using namespace std;int mythread(int var) { cout << var << endl; cout << "mythread start" << "ThreadId = " << this_thread::get_id() << endl; chrono::milliseconds dura(5000); this_thread::sleep_for(dura); cout << "mythread end" << "ThreadId = " << this_thread::get_id() << endl; return 100;}int main() { cout << "MianThreadID = " << this_thread::get_id() << endl; packaged_task myTask(mythread); thread objThread(ref(myTask), 233); objThread.join(); future ret = myTask.get_future(); cout << ret.get() << endl; cout << "主线程结束" << endl; return 0;}
promise的使用
promise是一个可以在多线程环境中赋值并在其他线程中取值的对象。通过将promise绑定到线程中,可以实现线程间的数据传递。例如:
#include#include #include #include #include #include
#include using namespace std;void mythread(promise & tmp, int clc) { cout << "mythread start" << "ThreadId = " << this_thread::get_id() << endl; clc++; clc *= 233; chrono::milliseconds dura(5000); this_thread::sleep_for(dura); int ret = clc; tmp.set_value(ret); cout << "mythread end" << "ThreadId = " << this_thread::get_id() << endl; return;}int main() { cout << "MianThreadID = " << this_thread::get_id() << endl; promise var_pro; thread objThread(mythread, ref(var_pro), 10); objThread.join(); future t1 = var_pro.get_future(); auto val1 = t1.get(); cout << val1 << endl; cout << "主线程结束" << endl; return 0;}
小结
这些技术(如async、future、packaged_task、promise)为C++提供了处理异步任务的强大工具。通过合理使用这些工具,可以实现多线程程序的高效执行。理解这些技术的使用方式,对于构建高效、稳定、多线程化的程序至关重要。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月20日 14时07分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
angr学习笔记(7)(malloc地址单元符号化)
2019-03-04
angr学习笔记(9)(添加约束)
2019-03-04
windows环境利用start命令实现微信多开
2019-03-04
「CF149D」括号涂色 区间DP好题
2019-03-04
树状数组 模板总结
2019-03-04
「NOI2015」程序自动分析 并查集题解
2019-03-04
[JSOI2008]Blue Mary的战役地图 Hash题解
2019-03-04
Ubuntu修改终端上显示的用户名和主机名(详细步骤)
2019-03-04
结构型设计在工作中的一些经验总结
2019-03-04
如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了!
2019-03-04
2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态
2019-03-04
“编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力!
2019-03-04
我是程序员,我用这种方式铭记历史
2019-03-04
CSDN湘苗培优|保持热情,告别平庸
2019-03-04
YbtOJ hash和hash表课堂过关 例1 字符串哈希【hash】
2019-03-04
前后端数据交互之表单
2019-03-04
剑指offer JZ21 栈的压入弹出序列
2019-03-04
Netty4服务端入门代码示例
2019-03-04
VL53L0x TOF激光测距的 stm32 HAL库驱动代码
2019-03-04
自定义标签(JSP2.0)简单标签
2019-03-04