【C++】多线程(四)

这是多线程的最后一篇文章。

std::promise

promise 的作用很简单,在一个线程t1中保存一个类型typename T的值,可供相绑定的std::future对象在另一线程t2中获取。事实上,它与future基本是成对出现的。来看下面的例子:

	//声明一个std::promise对象pr1,其保存的值类型为intpromise<int> pr1;//声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定future<int> fu1 = pr1.get_future();

promise和future之间是通过get_future()绑定的,对于一个promise而言,只能调用一次get_future()。

之后创建两个线程,线程1为promise赋值,线程2使用promise的值。

void Thread_Fun1(promise<int> &p)
{int iVal = 233;cout << "传入数据(int):" << iVal << endl;//传入数据iValp.set_value(iVal);
}void Thread_Fun2(future<int> &f)
{//阻塞函数,直到收到相关联的std::promise对象传入的数据auto iVal = f.get();		//iVal = 233cout << "收到数据(int):" << iVal << endl;
}
	//创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行thread t1(Thread_Fun1, ref(pr1));//创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行thread t2(Thread_Fun2, ref(fu1));//阻塞至线程结束t1.join();t2.join();

如果你对操作系统有一定的了解,你会发现,这有点像“生产者-消费者”问题,promise相当于生产者,future相当于消费者。

当然不能说promise的唯一意义就是让thread可以通过future传递一个返回值回来,反正有万能的引用。鉴于我公司的项目里对这个用得比较少,我也无法解释更多的含义了。

线程对自身的控制

thread所有针对自身的控制都在命名空间this_thread里,我这里介绍两个:

sleep_for

每次我学这种函数,我都有种无语的感觉。只是因为C语言的sleep()与平台有关,C++就要搞一个另外的sleep_for()出来,然后参数还是特别离谱的duraction,然后优点还是能保证底层以及多平台的兼容性… …唉。

说回正题,sleep_for()可以让线程暂停一段时间。比如刚才的函数就可以这么用:

void Thread_Fun1(promise<int> &p)
{this_thread::sleep_for(chrono::seconds(10));int iVal = 233;cout << "传入数据(int):" << iVal << endl;//传入数据iValp.set_value(iVal);
}

yield

yield()的作用是当前线程“放弃”执行,让操作系统调度另一线程继续执行。当然不是永久放弃,而是暂时交出时间片供操作系统调度,过一会会还回来的。

比如你在等待某个操作完成,循环while会使得操作系统没办法分资源给等待的线程出现死锁。这时就可以用yield()暂时交出控制权。

while(!isDone()); // 错误的写法,有可能死锁
while(!isDone()) yield(); // 正确的写法,暂时交出控制权

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

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

相关文章

广告设计师如何使用python_设计师必看!高效率工具,30分钟完成别人一天的工作!...

原标题&#xff1a;设计师必看&#xff01;高效率工具&#xff0c;30分钟完成别人一天的工作&#xff01;世界上只有两种物质&#xff1a;高效率和低效率&#xff1b;世界上只有两种人&#xff1a;高效率的人和低效率的人。—— 萧伯纳今天这篇文章主要想和大家分享一个效率工具…

Linux/MacOS/Mac OS 命令终端/命令行如何查找文件/搜索文件和删除文件

文章目录问题一&#xff1a;我要在当前目录下查找名称中含有“Lib”的文件和目录&#xff0c;注意不要在子目录下查找问题二&#xff1a;在当前目录下如何删除名称中含有“abc”的文件和文件夹问题一&#xff1a;我要在当前目录下查找名称中含有“Lib”的文件和目录&#xff0c…

div获取第一个子节点jquery_【antd】Tree组件子节点不完全勾选获取父节点的值

注意⚠️&#xff1a;这篇文章适用于后台返回的树结构比较多的情况下&#xff0c;如果数据比较少的情况下&#xff0c;可以参考我的上一篇文章&#xff0c;操作起来比较简单我们在实际操作tree组件和后台交互的时候一般都是需要将父节点传过去&#xff0c;如图&#xff1a;点击…

java中的jpa_在JPA中处理Java的LocalDateTime

java中的jpa几天前&#xff0c;我在处理JPA中的LocalDateTime属性时遇到问题。 在这篇博客文章中&#xff0c;我将尝试创建一个样本问题来说明该问题以及我使用的解决方案。 考虑以下实体&#xff0c;该实体为特定公司的员工建模– Entity Getter Setter public class Employ…

修改value_Python | 快速修改或命名N个文件夹名称,你会吗?

#欢迎交流&#xff1a;shuilinggan163.com#工作中&#xff0c;经常会遇到需要修改或新建很多文件的文件命&#xff0c;是一件重复且头疼的事情&#xff0c;下面一组Python代码&#xff0c;轻松教你快速实现&#xff01;程序一&#xff1a;根据文件(SSSSSS)新建并命名空文件夹im…

linux离线安装python3.7教程_Linux傻瓜式七步完美安装Python3.7

1 安装依赖包yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel gcc2 下载解压Python3.7# 1 首先切换到桌面cd /home# 2 下载wget http://www.python.org/f…

IntelliJ IDEA for Mac在MacOS模式下打开系统设置(偏好设置)的快捷键(Preferences Shortcut)

快捷键快捷键符号英文名称功能说明Command ,⌘,Open Settings dialog打开IDEA系统设置

gwt格式_GWT HTTP请求替代方案

gwt格式由于多种原因 &#xff0c;许多GWT用户放弃了RPC机制&#xff0c;这是GWT提供的调用后端的标准方法。 他们发现&#xff0c;在GWT RequestBuilder与其他可能不适合其应用程序模型的外部库之间迷失了自己。 这篇文章的目的是要通过GWT中众所周知的HTTP / Rest库来尝试使情…

簇的局部变量中布尔类型_java基础2(变量、常量、数据类型)

一、注释&#xff08;1&#xff09;什么是注释&#xff1f;解释说明的文字&#xff08;注释的内容不会被编译&#xff09;&#xff08;2&#xff09;注释的作用①对代码的解释说明 ②便于后期维护&#xff08;3&#xff09;注释的分类:①单行注释 //单行注释作用域:只在当前行有…

python生成海报_生成海报(前端 | python)

我最近没有摸鱼&#xff0c;一直都在工作。只不过目前需要爬一点数据 python 做的&#xff0c;之后看机会分享一下。忙着忙着老大说要生成海报&#xff0c;有个活动要给每个用户来个分享图。想法PS 批处理&#xff1f;脚本&#xff1f; 能甩出去的活都甩出去&#xff0c;机智如…

数位进制转换详解

文章目录进制进制转换二进制和十进制互相转换十进制 → 二进制十进制正整数 → 二进制十进制负整数 → 二进制十进制负小数 → 二进制十进制小数 → 二进制二进制 → 十进制二进制负整数 → 十进制二进制的正整数 → 十进制二进制小数 → 十进制二进制的负小数 → 十进制八进制…

java agent_如何脚踏实地构建Java Agent

java agent在构建Plumbr的多年中&#xff0c;我们遇到了许多具有挑战性的问题。 在其他方面&#xff0c;使Plumbr Java Agent可靠地执行而不会危及客户的应用程序&#xff0c;是一个特别棘手的问题。 从实时系统中安全地收集所有需要的遥测会带来很多问题。 其中一些非常简单&a…

python中链表和数组_数据结构笔记(一):数组、链表|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/(一)数组数组(Array)是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。1、数组支持随机访问&#xff0c;根据下标随机访问的时间复杂度为 O(1)。通过 a[i]_address a[0]_address i*元…

旋转散点图_聚类分析的结果如何用散点图展示出来?

SPSS系统聚类输出的树状图广受用户喜爱&#xff0c;二阶聚类也可以输出一系列美观的可视化图形用来观察聚类效果&#xff0c;但我们发现Kmeans均值聚类没有提供可视化程度高的图形&#xff0c;那怎么办&#xff0c;我们自己来制作。数据小兵推荐使用3D散点图全方位观察K均值聚类…

async 打包异常_重新打包流中的异常

async 打包异常Java 8已有两年历史&#xff0c;但是仍然存在社区尚未为其开发好的解决方案库的用例&#xff0c;甚至边缘用例。 如何处理流管道中的检查异常就是这样一个问题。 Stream操作接受的功能接口不允许实现抛出已检查的异常&#xff0c;但是我们可能要调用许多方法。 显…

补码基础

关于补码&#xff0c;有如下比较有趣的演化过程: 假如计算机中使用 4 位的二进制表示数据&#xff0c;如图-2&#xff0c;最多能表示 0 到 15(10 进制)&#xff0c;之后有牛人做了 一个细微改动&#xff0c;如图-3&#xff0c;将所有二进制以 1 开头的数(大于 7 的数)放到 0 之…

身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」

作者&#xff1a;沫沫 政采云前端团队转发链接&#xff1a;https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ前言近些年来&#xff0c;随着生物识别技术的逐渐成熟&#xff0c;基于深度学习的人脸识别技术取得了突破性进展&#xff0c;准确率显著提高。现阶段&#xff0c;人…

打开 谷歌浏览器exe_专治各种网银不服:两步开启微软Edge浏览器IE兼容模式

此前微软已经预告过Microsoft Edge将支持IE模式&#xff0c;即可以在该浏览器下使用IE模式加载某些特定的需要的网站。不过在后续更新中微软又突然改口不再面向普通用户提供此功能&#xff0c;而企业级用户若要使用还需要管理员提前配置。现在这款浏览器的正式版已经发布&#…

java单例枚举_Java增强枚举的用例

java单例枚举Brian Goetz在消息“ 增强枚举-用例 ”中写道&#xff1a;“我们希望就现在实现的功能[ 增强枚举 ]获得用户反馈。” 他陈述了他的消息的第一个目的&#xff1a;“开始工作&#xff0c;这是一些通用枚举可能有用的典型用例。” 所提供的两个示例中的第一个示例是重…

爱python网_Python

一、PIL库简介1.安装PIL库PIL库是Python的第三方库&#xff0c;需要手动通过pip工具安装。可通过cmd命令&#xff1a;pip install pillow 进行安装。(注意&#xff1a;出现pip不是内部处理命令时需要配置一下环境)。2.PIL库的功能PIL库支持图像存储、显示和处理&#xff0c;它…