(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++提供了处理异步任务的强大工具。通过合理使用这些工具,可以实现多线程程序的高效执行。理解这些技术的使用方式,对于构建高效、稳定、多线程化的程序至关重要。

上一篇:用户数据报协议(UDP)介绍
下一篇:(C++11/14/17学习笔记):单例设计模式共享数据分析,call_once()函数

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月20日 14时07分18秒