【C++】线程库常用接口

news2024/12/30 2:41:27

1.创建线程,等待线程,获取线程id

2.全局变量,局部变量,互斥锁

要让不同的线程访问同一个变量和同一把锁,有两种方法:

2.1方法一

定义全局的变量和全局的锁,这样自然就能访问到。

但全局变量在多个源文件重命名的话,在链接时容易出现链接错误。

2.2方法二

在主线程处定义局部的变量和局部的锁,不过要传引用。

特别注意:在传参的时候要用ref修饰变量和锁,因为C++的线程库只是对底层系统调用的封装。

Linux系统中,系统调用pthread_create要求传进来函数参数要是void*,返回值是void*,下面一个参数是作为该函数的参数,类型是void*。所以C++的线程库要对100,x,mtx封装成结构体,后面还要把这个结构体的每一个成员解析出来交给线程函数去调用,这其中有很多步骤只是值拷贝,而不是引用传参。

所以用ref修饰一下就是强制要求在上述步骤中的传参全部用引用的方式传参,这样多个线程函数才能访问到同一个局部变量。

当然也可以直接传指针,这样底层对指针进行值拷贝也没事。

3.lambda表达式构造线程

方式一:

方式二:

3.1构造多线程

4.解决死锁问题:lock_guard

试想一下,如果有一个线程在lock和unlock之间抛异常了的话,那就不会解锁,就出现了死锁问题。

为了解决死锁问题,C++11封装了一个LockGuard的类。它的构造函数就是把传进来的锁保存起来,然后上锁。析构函数就是解锁。这样一来,就算线程在访问临界区抛异常了,线程结束前也会调用析构函数解锁。这里注意:锁不支持拷贝构造,所以LockGuard的成员变量要用mutex&。

那么如何让新封装出来的锁只锁住临界区呢:

简单定义一个局部域就可以了!花括号是可以定义局部域的,出了一个局部域之后,会自动调用析构函数。当然这个是我们自己封装出来的,调用库中的接口如下:

5.atomic

头文件是<atomic>。

atomic<int> x=0;表示下面对x的一些加减等简单的操作是原子的。

可用于一些小的修改,小的操作,保证线程安全。在部分情况下可代替锁。

这样做的效率和锁的效率差不多。

这样可以直接cout打印,但是要用printf的话,需要x.load().来打印。

6.条件变量

直播样例:

这个程序就是构建出两个线程,一个线程打印偶数一个线程打印奇数,且必须先打印0后打印1,这样来回交替。

其中条件变量是配合flag使用的,一旦调用c.wait()(非原子,需要调用互斥锁),该线程必定会阻塞(且在阻塞前会解锁),等待其他线程唤醒。c.notify()是随机唤醒一个线程,如果没有线程阻塞,那么啥也不干。

unique_lock和lock_guard功能类似。

课件样例:

这是条件变量的第二种等待方式,与第一种类似。第一个参数是锁,在阻塞时会解锁。第二个参数是一个仿函数,它的返回值为真就不阻塞,返回值为假就阻塞。

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

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

相关文章

物联网护士站!RFID与传感技术如何提升病患管理智能化?

随着物联网技术的迅速发展&#xff0c;智慧医疗的理念逐渐被广泛应用于医院管理和医疗服务中&#xff0c;成为现代医疗的重要组成部分。通过物联网技术的引入&#xff0c;医院不仅能够实现对患者的智能化医疗&#xff0c;还能高效管理设备和物资&#xff0c;从而推动智慧医疗的…

[C++]使用onnxruntime部署yolov8-cls图像分类onnx模型

如果只需要opencv去部署yolov8分类模型可以参考博文&#xff1a;https://blog.csdn.net/FL1623863129/article/details/142734780 本文和 opencv去部署yolov8分类模型区别是&#xff1a;opencv部署推理核心使用opencv自带api&#xff0c;而本文推理核心用的onnxruntime&#x…

ros2:从github上下载源码进行编译

首先&#xff0c;创建工作空间 # 1. 递归创建工作空间目录 mkdir -p catkin_ws/src # 2. 进入src目录 cd catkin_ws/src然后如果你没有安装git&#xff0c;需要 sudo apt install git然后输入。 git clone https://github.com/6-robot/wpr_simulation.git这时候&#xff0c;…

LeetCode-12. 整数转罗马数字【哈希表 数学 字符串】

LeetCode-12. 整数转罗马数字【哈希表 数学 字符串】 题目描述&#xff1a;解题思路一&#xff1a;贪心解题思路二&#xff1a;背诵版&#xff0c;只需写出1954开头的数字进行贪心即可。解题思路三&#xff1a;暴力匹配 题目描述&#xff1a; 七个不同的符号代表罗马数字&…

拿下奇怪的前端报错:1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点

问题背景 在一个使用MongoDB GridFS实现文件存储和分片读取的项目中&#xff0c;同事遇到了一个令人困惑的问题&#xff1a;音频文件总是丢失最后几秒&#xff0c;视频文件也出现类似情况。更奇怪的是&#xff0c;播放器显示的总时长为无限大。这个问题困扰了团队成员几天&…

gradle build --offline idea怎么配置 打包命令使用gradle build --offline进行打包怎么操作

两种方式 1&#xff1a;一种命令行执行gradle build --offline 2&#xff1a;一种直接gradle这里单击离线

多模态理论——什么是多模态?多模态的关键技术?

多模态理论 文章目录 多模态理论1.什么是多模态&#xff08;multimodal&#xff09;2.深度学习中的多模态3.多模态学习的关键技术3.1模态表示3.2多模态对齐3.3多模态融合 4.多模态任务 1.什么是多模态&#xff08;multimodal&#xff09; 模态指的是数据或者信息的表现形式&am…

完美收官丨飞易通端到端整体解决方案助力嵌入式技术发展

2024年10月10日&#xff0c;Embedded World 2024展会在美国德克萨斯州奥斯汀完美收官。Embedded World 2024是嵌入式系统领域的全球性盛会&#xff0c;汇聚了来自世界各地的专业人士&#xff0c;促进了嵌入式系统、工业自动化、汽车技术和通信系统领域的合作与发展。 应展会举办…

深入解析 Go 语言中的结构体:从基础用法到高级技巧的全方位指南

结构体&#xff08;Struct&#xff09;是 Go 语言中的一种重要数据类型&#xff0c;能够帮助我们将多个数据组合成一个自定义的类型。与其他编程语言的类&#xff08;Class&#xff09;类似&#xff0c;结构体允许我们定义字段、方法&#xff0c;并灵活操作数据。本文将从基础到…

遥控器传输信号算法详解!

一、算法概述 无人机遥控器信号传输算法主要基于无线通信技术&#xff0c;通过特定的调制、编码和信号处理技术&#xff0c;将遥控器的操作指令转化为无线电信号&#xff0c;并传输给无人机。无人机接收到信号后&#xff0c;再将其解码为可识别的指令&#xff0c;从而实现对无…

10月造价、注安考试的押题资料,到底有没有用?

​随着考试的临近&#xff0c;各大考试机构也开始推出了各种考前押题资料。面对网络铺卷而来的考前押题资料&#xff0c;考生自己也无从判断资料的质量&#xff0c;那该如何选择靠谱的押密资料呢&#xff1f;今天考试100就带大家来分析一下&#xff1a; 1、正确看待押题资料 首…

标签页(tabs)内容的显示和样式

1. 代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Tabs Example</title> &…

吴恩达深度学习笔记(一)-基础知识

上图三种神经网络&#xff1a;标准、卷积&#xff08;用于图像&#xff09;、循环&#xff08;序列化数据、时序数据&#xff09; 数据类型&#xff1a;结构化&#xff08;表格&#xff09;、非结构化&#xff08;语言、图片、文本&#xff09; 二分类问题&#xff1a; 0、1判…

Qt-窗口对话框QFileDialog的使用(53)

目录 描述 相关函数 使用 描述 文件对话框 ⽂件对话框⽤于应⽤程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件 相关函数 打开⽂件&#xff08;⼀次只能打开⼀个⽂件&#xff09; QString getOpenFileName 打开多个⽂件&#xff08;⼀次可以打开多个⽂件…

2024下半年软考中级网络工程师,这100题,必做!

第一章节&#xff1a;计算机硬件基础&#xff08;5&#xff09; 1、在机器指令的地址字段中&#xff0c;直接指出操作数本身的寻址方式称为&#xff08; &#xff09;。 A 隐含寻址 B 寄存器寻址 C 立即寻址 D 直接寻址 答案&#xff1a;C 解析: 立即寻址方式通常直接在指…

Copilot Coaching新功能铸就Word更强

Copilot 的意思是副驾驶。 现在&#xff0c;您的副驾驶教练来了&#xff1a;Copilot Coaching Copilot Coaching 是 Word 中的一项新 Copilot 功能&#xff0c;可在您查看内容时为您提供支持&#xff0c;以实现语法和拼写之外的改进 - 帮助您澄清想法&#xff0c;并为您提供有…

Granafa配置基于elasticsearch数据源的折线图

Granafa可以直接配置基于elasticsearch数据源的折线图&#xff0c;用于展示es库中数据的最值、均值、总量等

AI绘画教程 重阳节海报设计

本期 AI 绘画的主题是海报设计&#xff0c;让我们一同探索能设计出哪些不同风格的海报吧。 今天是重阳节&#xff0c;一起用 AI 绘画制作一些画风清新的海报吧。正所谓 “遥知兄弟登高处&#xff0c;遍插茱萸少一人”。让我们一起通过这些设计&#xff0c;在对长辈的思念与祝福…

2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型

E题补完计划开始,接着之前专栏里面的E题内容写完接下来的所有问题。经过第一问得到了最佳物料编码的前六位排名: 是通过聚合指标和熵权法计算得到的,现在我们需要完成第一问的接下来两个目标,分别是建立物料需求的周预测模型和利用历史数据对预测模型进行评价。对于周预测…

Python物联网编程:10个IoT设备通信的脚本

今天我们要聊的是如何使用Python编写脚本来实现10个IoT设备之间的通信。物联网&#xff08;IoT&#xff09;是一个充满无限可能的领域&#xff0c;它将日常设备连接到互联网&#xff0c;使它们能够互相通信、收集数据并做出响应。Python以其简洁易懂的语法和强大的库支持&#…