C++多线程的线程返回值问题

news/2024/5/15 5:29:17/文章来源:https://blog.csdn.net/m0_56104219/article/details/126914330

对于多线程可执行对象的返回值是何时返回,以及得到的呢?

对于需要用到线程返回值的线程要使用future类对象来实现

文章目录

  • future对象
    • async()
      • launch::deferred参数
      • launch::async参数
    • packaged_task
  • promise

future对象

是一个类模板
提供访问异步对象的操作结果机制

  • (通过 std::async 、 std::packaged_task 或 std::promise 创建的)异步操作能提供一个 std::future 对象给该异步操作的创建者。
  • 异步操作的创建者能够使用多种方式查询、等待或从future中提取值。如果异步操作未能提供值,那么这写方法会阻塞
  • 异步操作准备好发送结果给创建者时,它能通过修改链接到创建者的 std::future 的共享状态(例如 std::promise::set_value )进行。
#include<iostream>
#include<future>
//#include<thread>
using namespace std;
int returnThread()
{cout << this_thread::get_id() << ">: 子线程正在执行" << endl;cout << this_thread::get_id() << ">: 子线程开始睡眠" << endl;this_thread::sleep_for(chrono::seconds(5));cout<< this_thread::get_id() << ">: 子线程睡眠了5秒" << endl;return 10;
}int main()
{cout<< this_thread::get_id() << ">: 主线程正在执行" << endl;future<int> res = async(returnThread);cout << "线程返回值为>: " << res.get() << endl;cout << this_thread::get_id() << ">: 主线程开始睡眠" << endl;this_thread::sleep_for(chrono::seconds(2));cout << this_thread::get_id() << ">: 主线程睡眠了2秒" << endl;cout << "主线程结束" << endl;return 1;
}

在这里插入图片描述
程序执行到future.get()方法时,会执行子线程,整体的进程进行会阻塞在子线程的进行,当子线程执行完毕后进程恢复,其他线程执行

async()

创建一个线程,并绑定,但是线程并执行,但是当线程中需要很十分耗时时,程序并不会阻塞在这里,而是继续执行别的线程。

#include<iostream>
#include<future>
//#include<thread>
using namespace std;
int returnThread()
{cout << this_thread::get_id() << ">: 子线程正在执行" << endl;cout << this_thread::get_id() << ">: 子线程开始睡眠" << endl;this_thread::sleep_for(chrono::seconds(1));cout<< this_thread::get_id() << ">: 子线程睡眠了1秒" << endl;return 10;
}int main()
{cout << this_thread::get_id() << ">: 主线程正在执行" << endl;future<int> res = async(returnThread);cout << this_thread::get_id() << ">: 主线程开始睡眠" << endl;this_thread::sleep_for(chrono::seconds(2));cout << this_thread::get_id() << ">: 主线程睡眠了2秒" << endl;	cout << "线程返回值为>: " << res.get() << endl;cout << "主线程结束" << endl;return 1;
}

在这里插入图片描述

可能还有些不太明白,什么是进程的阻塞和线程的执行

launch::deferred参数

这个参数放到async函数的第一个位置,设置async函数仅仅是创建一个线程而不执行,当下面的代码中有get或者wait方法执行时,才会开始该线程的执行

对比一下上面的代码执行顺序
在这里插入图片描述

int main()
{cout << this_thread::get_id() << ">: 主线程正在执行" << endl;future<int> res = async(launch::deferred,returnThread);cout << this_thread::get_id() << ">: 主线程开始睡眠" << endl;this_thread::sleep_for(chrono::seconds(2));cout << this_thread::get_id() << ">: 主线程睡眠了2秒" << endl;cout << "线程返回值为>: " << res.get() << endl;cout << "主线程结束" << endl;return 1;
}
  • 当使用了该参数,后面的代码执行不调用get或者wait则这个线程不会运行

launch::async参数

这就是async函数的默认参数,默认允许的情况下执行子线程

packaged_task

用于包装任何可调用对象的,使得能够异步调用它。其返回值和抛出异常存储于能够通过std::future对象的共享状态中

#include<iostream>
#include<future>
using namespace std;int func(int x, int y)
{return pow(x, y);
}int main()
{packaged_task<int(int, int)> task(func);future<int> res = task.get_future();thread taskThread(move(task), 2, 10);taskThread.join();cout << res.get() << endl;packaged_task<int(int, int)> task2([](int x, int y) { return pow(x, y); });future<int> res2 = task2.get_future();thread taskThread2(move(task2), 2, 11);taskThread2.join();cout << res2.get() << endl;
}

promise

promise用于获得线程执过程中的值

#include<iostream>
#include<future>
using namespace std;int func(int x, int y)
{return pow(x, y);
}
void myFunction(promise<int>& pro, int val)
{this_thread::sleep_for(chrono::seconds(5));pro.set_value(++val);cout << this_thread::get_id() << "线程正在执行 value = " << val << endl;}
void myFunction2(future<int>& fu1)
{int num = fu1.get();this_thread::sleep_for(chrono::seconds(5));cout << this_thread::get_id() << "线程正在执行 value = " << ++num << endl;
}
int main()
{clock_t startTime = clock();promise<int> pro;thread t1(myFunction, ref(pro), 10);t1.join();future<int> f1 = pro.get_future();thread t2(myFunction2, ref(f1));t2.join();clock_t endTime = clock();cout << "程序耗时>: " << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;return 1;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_10092.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化 | Management Science 7-8月文章精选: 信息系统中的运筹学

作者&#xff1a;Evelyn Yao 清华大学本科在读 在“Management Science近期论文精选”中&#xff0c;我们有主题、有针对性地选择了Management Science中一些有趣的文章&#xff0c;不仅对文章的内容进行了概括与点评&#xff0c;而且也对文章的结构进行了梳理&#xff0c;旨在…

非零基础自学Java (老师:韩顺平) 第13章 常用类 13.5 StringBuffer类

非零基础自学Java (老师&#xff1a;韩顺平) ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】 第13章 常用类 文章目录非零基础自学Java (老师&#xff1a;韩顺平)第13章 常用类13.5 StringBuffer类13.5.1 基本介绍13.5.2 String VS StringBuffer13.5.3 String 和 Str…

HashMap

1.HashMap集合 1.1HashMap集合概述和特点【理解】 HashMap底层是哈希表结构的依赖hashCode方法和equals方法保证键的唯一如果键要存储的是自定义对象&#xff0c;需要重写hashCode和equals方法 1.2 特点 HashMap是线程不安全的实现&#xff1b; HashMap可以使用null作为key…

【Pytorch深度学习实战】(9)神经语言模型(RNN-LM)

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

第一视角体验搭载全志T507-H的开发板MYD-YT507H开发板

如今车规级芯片市场潜力巨大&#xff0c;需求旺盛&#xff0c;芯片都在逐渐走向国产化。本文要介绍的主角是MYD-YT507H开发板&#xff0c;该开发板是米尔科技结合全志国产工业级平台CPU——全志T507-H芯片研制的CPU模组&#xff0c;全志T507-H可广泛用于电力物联网、汽车电子、…

目标检测开源框架YOLOv6全面升级,更快更准的2.0版本来啦

9月5日&#xff0c;美团视觉智能部发布了YOLOv6 2.0版本&#xff0c;本次更新对轻量级网络进行了全面升级&#xff0c;量化版模型 YOLOv6-S 达到了 869 FPS&#xff0c;同时&#xff0c;还推出了综合性能优异的中大型网络&#xff08;YOLOv6-M/L&#xff09;&#xff0c;丰富了…

一个div靠左另一个靠右

1.使用flex布局<style>#back{border: red solid 1px;width: 800px;height: 500px;display: flex;align-items: center;}#left{border: blue 1px solid;width: 100px;height: 100px;justify-content: flex-start;}#right{border: blue 1px solid;width: 100px;height: 100…

【前端进阶】-TypeScript类型声明文件详解及使用说明

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【TypeScript专栏】 前三篇文章讲解了TypeScript的一些高级类型 详细内容请阅读如下&#xff1a;&#x1f53d; 【前端进阶】-TypeScript高级类型 | 泛型约束、泛型接口、泛型工具类…

Google Pub/Sub入门

什么是Google Pub/Sub&#xff1f; 首先他是一个messaging buffer/coupler消息缓冲区/耦合器&#xff0c;Decouples senders and receivers解耦发送者和接收者。 一些特性&#xff1a; 使用 Dataflow 注入分析事件并将其流式插入到 BigQuery免运维、安全、可伸缩的消息传递系…

MySQL基础总结合集

MySQL是啥&#xff1f;数据库又是啥&#xff1f; MySQL&#xff1a; MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 数据库&#xff1a; 数…

基于nodejs+vue的读书会网站

实行网上读书会网站&#xff0c;对其改善目前人们读书现状提供一些帮助和优化措施&#xff0c;为人们在未来看书节约了很多时间&#xff0c;使得人们在未来利用自己有限的时间可以看到更多对自己有益的书籍。 基于Vue的读书会网站的实现&#xff0c;通过网上系统的研发构造&…

你是否想过,GitHub Pages也可以自动构建?|原创

本文讲述了如何利用 GitHub Actions 来自动构建 GitHub Pages 项目&#xff0c;免去繁琐的手动构建再提交过程&#xff0c;让你专注于写作。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达GitHub Actions 自动构建之前的文章我们已经讲过…

Tomcat 在IDEA中运行Tomcat,控制台乱码问题的解决方案

IDEA中运行Tomcat,控制台乱码问题的解决方案试了好多种网上的方案(只有这一种能解决)环境:jdk 11 idea 2022.2.4 tomcat 9.0.54解决方案: 1.打开tomcat的配置文件(apache-tomcat-9.0.54\conf\logging.properties)将文件中的java.util.logging.ConsoleHandler.encoding =…

el-tree增加提示语

element ui tree树形控件加提示信息<el-tree :data="tieLinedata" :props="defaultProps" @node-click="handleNodeClick"><span class="span-ellipsis" slot-scope="{ node, data }"><span :title="no…

【图像增强】基于DEHAZENET和HWD的水下去散射图像增强附matlab代码

1 内容介绍 去散射和边缘增强是解决水下图像的对比度严重衰减、颜色偏差和边缘模糊等问题的关键步骤。这篇论文提出了一种较好的水下图像增强的方法。首先使用经过端到端训练的卷积神经网络去测量输入图片&#xff0c;同时以自适应双边滤波器对传输图片进行处理。接着提出一种…

allure介绍——生成完美的测试报告

一、allure简介 Allure是输出网页测试报告的一种框架 1、该框架是基于Java写的,所以安装该框架需要先安装JDK; 2、下载allure命令行工具,路径:https://github.com/allure-framework/allure2/releases 注:①下载包放到pytest文件夹中,然后将allure/bin的路径放到环境变量的…

css font-size设置小于12px失效(转)

原文:https://blog.csdn.net/weixin_38629529/article/details/119866495 1、描述 不知道你有没有遇到这样的情况,设置了font-size为10px,打开控制台审查元素也显示的是10px,但浏览器渲染的字体大小还是没有发生改变。 这是因为浏览器(以Chrome为例,其他没测试过)在中文…

第五篇、Callable接口实现多线程

文章目录前言一、实现Callable接口二、代码示例1.Callable接口实现多线程总结前言 上一篇我们共同认识了并发问题&#xff0c;那么本篇我们将一起来学习Callable接口实现多线程。 一、实现Callable接口 上篇内容我们通过实现Runnable实现多线程&#xff0c;本篇我们将学习如何…

非零基础自学Java (老师:韩顺平) 第13章 常用类 13.11 日期类

非零基础自学Java (老师&#xff1a;韩顺平) ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】 第13章 常用类 文章目录非零基础自学Java (老师&#xff1a;韩顺平)第13章 常用类13.11 日期类13.11.1 第一代日期类13.11.2 第二代日期类13.11.3 第三代日期类13.11.4 Dat…

线稿图视频制作--从此短视频平台不缺上传视频了

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f970; 博客首页&#xff1a;knighthood2001 &#x1f6…