C++11异步与通信之 packaged_task

news/2025/1/15 6:34:39/

概念简介

packaged_task 用于包装可调用目标(Callable)为一个对象,如lambda,普通函数,小括号重载等,用于异步调用
其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中,和promise类似。

将函数的调用与函数返回值的获取分开调用,这样就给异步提供很大的便利。

猛的一看好像和std::bind绑定器作用相似,可惜std::bind返回的对象是同步的。

示例:函数在子线程执行,返回值可以在主线程异步获取

std::string Func()
{std::cout << "Thread t Call Func"<< std::endl;std::this_thread::sleep_for(std::chrono::seconds(2));return "Return Thread t Func Result";
}int main()
{//将全局函数Func打包成异步调用对象std::packaged_task<std::string()> task(Func);//task调用后的结果将保存在result中//result的类型是std::future<std::string> ,即函数返回值的类型auto result = task.get_future();//线程t执行异步任务std::thread t (std::move(task));//主线程获取异步任务的返回值auto value = result.get();//打印结果std::cout << "Main Thread Get Return value = " << value << std::endl;t.join();return 0;
}

执行结果:

Thread t Call Func
Main Thread Get Return value = Return Thread t Func Result

补充:

有一些任务执行可能比较耗时,我们可以使用其提供的带时间的结果获取

  • std::future_status::timeout 异步任务已经完成并返回结果。此时可以通过调用std::future::get()来获取异步任务的返回值;
  • std::future_status::ready 等待异步任务超时。此时可以选择等待更长时间再尝试获取结果,或者取消任务;
  • std::future_status::deferred 异步任务被推迟执行。此时可以暂时不获取结果,等待后续需要时再执行异步任务,或者放弃执行异步任务。利用std::future::deferred策略将异步任务推迟到std::future::get()方法调用时才执行,从而实现惰性求值。这种方式下,异步任务的执行被推迟,直到调用std::future::get()方法时再执行。返回该状态意味着异步任务还未执行,并且只有调用std::future::get()时才会执行。
    if(result.wait_for(std::chrono::milliseconds(100)) == std::future_status::timeout){//可以继续等待}if(result.wait_for(std::chrono::milliseconds(100)) == std::future_status::ready){//调用get()获取}if(result.wait_for(std::chrono::milliseconds(100)) == std::future_status::deferred){//调用get()获取}

http://www.ppmy.cn/news/1029349.html

相关文章

c++病毒/恶搞代码大全( 上 )

注&#xff1a;以下代码应勿用于非法&#xff08;Dev-c5.11实测可用&#xff09; 1: 效果:无限生成cmd 解决方法&#xff1a;关闭程序即可 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {while(1)system("start cmd"…

SpringBoot复习:(36)国际化

一、Resources目录下建立一个目录&#xff08;比如international)来存储资源文件 message.properties 空的&#xff0c;但不能没有 message_zh_CN.properties hello您好message_en_us.properties hellohello world二、自动配置类MessageSourceAutoConfiguration 常量MESSAGE…

MybatisPlus多数据源

适用于多种场景&#xff1a;纯粹多库、 读写分离、 一主多从、 混合模式等 目前我们就来模拟一个纯粹多库的一个场景&#xff0c;其他场景类似 以下的案例是使用多个数据库 准备工作在不同的数据库中创建不同的表分别为t_user 和product 启动类记得加MapperScan注解 第一步&a…

Spring的事件处理机制

文章目录 1.前言2.事件机制三要素2.1 定义事件2.2 监听事件1.实现 ApplicationListener 接口2.使用 EventListener 注解3.TransactionalEventListener注解 2.3 发布事件 3.异步事件4.实战 1.前言 最近看公司代码&#xff0c;发现针对消息队列的消费和分发做了很多很精妙的设计…

day24-106.从中序与后序遍历序列构造二叉树

106.从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&am…

jsoup解析html之table表格

jsoup解析html之table表格 jsoup说明 一款Java 的HTML解析器 jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 主要功能 从一…

【K8S系列】深入解析k8s网络插件—Weave Net

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 Kubernetes (k8s) 是一个容器编…

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初步使用(二)

前言&#xff1a; 在前面一篇文章云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初始安装&#xff08;一&#xff09;_华为cna_晚风_END的博客-CSDN博客 介绍了基于VMware虚拟机里嵌套部署华为云的云计算&#xff0c;不过仅仅是做到了在VRM的web界面添加计算节点…