当前位置: 首页 > news >正文

c++多线程 1

https://www.runoob.com/cplusplus/cpp-multithreading.html

两种类型的多任务处理:基于进程和基于线程。

基于进程的多任务处理是程序的并发执行。
基于线程的多任务处理是同一程序的片段的并发执行。

线程

c++11以后有了 标准库

1 函数
2 类成员函数
3 lambda函数
4 仿函数
https://www.jianshu.com/p/99f2bdd427ba
仿函数是定义了一个含有operator()成员函数的对象,可以视为一个一般的函数,只不过这个函数功能是在一个类中的运算符operator()中实现,是一个函数对象,它将函数作为参数传递的方式来使用。

https://blog.csdn.net/toby54king/article/details/105103111

5 类的静态成员函数
因为静态 函数 不与类的任何对象相关联。 因此,我们可以直接将类的 静态成员函数 作为 线程函数 传递,而无需传递任何指向对象的指针。

thread t5(mythread2::func,3,"xxx"); 书写的时候加上类名

6 类的普通成员函数
必须先创建类的对象,必须保证对象的生命周期比子线程要长,
因为类的普通成员函数可能访问类的普通成员变量,如果对象销毁了,可能发生内存泄漏

mythread3 myth;
thread t6(&mythread3::func,&myth,3,"xccccc");
第一个参数填成员函数的地址
第二个参数填对象的地址,也就是this指针
后面才是成员函数的对象参数

https://baike.baidu.com/item/%E7%BA%BF%E7%A8%8B/103101

C++ 11 线程
C++ 11 线程的头文件是。
创建线程std::thread::thread(Function&& f, Args&&... args); [3] 
等待线程结束std::thread::join(); [3] 
脱离线程控制std::thread::detach(); [3] 
交换线程std::thread::swap( thread& other ); [3] 

https://www.bilibili.com/video/BV198411e76j/?spm_id_from=333.337.search-card.all.click&vd_source=e7d12c9f66ab8294c87125a95510dac9

#include<thread>

1 如何创建线程

main函数中的程序为主程序,又叫主线程
对象thread 中的为子线程
主线程只有一个,子线程与硬件资源有关,硬件越好,就可以创建越多的子线程
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

仿函数的方式创建一个类在类里面重载 operator()然后
thread t4(mythread1(),3,"woshiyizhishashaniao");

删除拷贝构造

不允许线程对象之间的拷贝

在这里插入图片描述
转移之后原来的线程对象不再代表线程

在这里插入图片描述

回收线程的资源

先创建的不一定跑的快
线程的任务函数返回后子线程将会终止
如果主程序推出,子程序全部终止

demo程序复制到linux中
头文件修改
unistd.h
sleep也需要修改

join()函数 等待子程序退出,回收资源,如果已退出就立即返回
detach() 主程序不能退出
joinable()返回布偶类型

this thread

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

call once

想要只执行一次的函数
可以放在主函数中
但是有时需要放在线程函数中
这个时候可以考虑
在这里插入图片描述
在这里插入图片描述
call once 第一个参数 锁 ,函数名, 参数

这里提到可以自己手动设置一个flag 置1或者置0
用if语句进行调用,这样是不行的

native handle

在这里插入图片描述

不同系统 线程库不同

linux的 pthread 线程库文件
编译过程中
g++ -0 demo01 demo01.cpp -std=c++11 -lpthread
https://www.runoob.com/w3cnote/gcc-parameter-detail.html

在子线程运行时想要终止他
linux的线程库拥有该功能
man pthread_cancel
这里的线程id和c11的不是同一个东西,c11的thread类没有这个东西

在这里插入图片描述

线程安全

共享进程资源

一个房间5个人住只有一个厕所

全部线程共享cout对象,容易造成输出紊乱

全局变量aa 两个子线程都分别加上100次
出现的aa随机,无法确定 不是200

顺序性 可见性 原子性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三个步骤并非一次性执行完,例如自己的cpu时间片用完了,就会被操作系统切换出去,到线程再次获得时间片时,黄花菜都凉快了
理解为来不及了
上述提到的 全局变量aa 如果是原子操作 那么得到的结果就是 200了

在这里插入图片描述
保证内存变量的可见性,禁止代码优化 重排序
关键字修饰变量 无法解决问题,只解决了线程可见性问题
电脑是多核的
但是在单核的情况下结果是正确的 (没用到关键字)

在这里插入图片描述
在这里插入图片描述

互斥锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在使用cout资源时 申请加锁 ,这个线程加了锁,就只有这个线程能用了,别的线程得等待,直到这个线程把锁给解锁了,别的线程才能加锁。
但是他视频中所有线程都是公用这一个函数

在这里插入图片描述
在这里插入图片描述
trylock() 应用场景为公共厕所有多个 一个满了直接找另一个 不需要等待
未锁定状态 就加锁成功 返回 true
锁定状态就是 加锁失败 返回false 不会阻塞等待

time_mutex
bool try_lock_for(时间长度) 如果等待时间太长 就放弃
bool try_lock_until(时间点)

recursive_mutex类

递归互斥锁 允许同一线程多次获得互斥锁,可以解决同一线程多次加锁造成的死锁问题

例如 函数1 中有加锁和解锁
函数2中也有加锁和解锁,函数2中调用了函数1

调用函数2 报错 原因是 出现了死锁。
函数2持有锁,再去调用函数1,发现函数1不可能申请到锁,就出现了死锁。
如果把普通锁改为递归锁就不会报错

lock guard类

在这里插入图片描述
在这里插入图片描述

条件变量 生产 消费者模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
给代码加上一个作用域, 处理的时候不需要占用锁的资源

在这里插入图片描述
字符变量message应该定义在作用域的外面

用aa的outcache 成员函数创建三个消费者线程

6 类的普通成员函数

消费者线程创建了就一直存在,不会退出
并且 incache成员函数只用于生产数据,生产完数据函数就返回了。
在这里插入图片描述
在这里插入图片描述

代码

在这里插入图片描述
原本认为只有唤醒一个线程
等待队列
也可以唤醒所有线程

所有线程竞争队列中的数据
条件变量wait一般放在消费者
unique lock 可以手动解锁,从而消除作用域

申请加锁, 只有一个线程阻塞在等待唤醒者信号 其余都阻塞在等待加锁的地方
在这里插入图片描述
在这里插入图片描述

虚假唤醒在这里插入图片描述

原子类型

在这里插入图片描述

在这里插入图片描述
互斥锁代价比较高
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

c++多线程 1

https://www.runoob.com/cplusplus/cpp-multithreading.html 两种类型的多任务处理&#xff1a;基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 线程 c11以后有了 标准库 1 函数 2 类成员函数 3 lambda函…...

STM32F103制作FlashDriver

文章目录前言芯片内存定义实现过程FlashDriver生成段定义擦除函数写入函数编译后的map手动测试HexView提取指定地址内容并重映射总结前言 在汽车行业控制器软件刷新流程中&#xff0c;一般会将Flash驱动单独进行刷写&#xff0c;目的是防止程序中一直存在Flash驱动的话&#x…...

springboot树形结构接口, 懒加载实现

数据库关系有父子id的, 作为菜单栏展示时需要用前端需要用到懒加载, 所谓懒加载就是接口有一个标志位isLeaf, 前端请求后通过该字段判断该节点是否还有子节点数据 创建数据库表 t_company_info结构有id和parentId标识, 用来表示父子关系 /*Navicat Premium Data TransferSourc…...

java企业级信息系统开发学习笔记02初探spring——利用组件注解符精简spring配置文件

文章目录一、学习目标二、打开01的项目三、利用组件注解符精简spring配置文件&#xff08;一&#xff09;创建新包&#xff0c;复制四个类&#xff08;二&#xff09;修改杀龙任务类&#xff08;三&#xff09;修改救美任务类&#xff08;四&#xff09;修改勇敢骑士类&#xf…...

用Python发送电子邮件?这也太丝滑了吧(21)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 猫爸赚钱养家&#xff0c;细想起来真的不容易啊&#xff01; 起早贪黑&#xff0c;都是6点早起做早饭&#xff0c;送…...

分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测

分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测分类效果模型描述程序设计参考资料分类效果 模型描述 Matlab实现CNN-GRU-Attention多变量分类预测 1.data为数据集&#xff0c;格式为excel&#xff0c;12个输…...

C++提高编程(1)

C提高编程1.模板1.1模板的概念1.2函数模板1.2.1函数模板语法1.2.2函数模板注意事项1.2.3函数模板案例1.2.4普通函数与函数模板的区别1.2.5普通函数与函数模板的调用规则1.2.6模板的局限性1.3类模板1.3.1类模板语法1.3.2类模板和函数模板区别1.3.3类模板中成员函数创建时机1.3.4…...

day26 回溯算法的部分总结

回溯算法的部分总结 回溯算法是一种常用于解决排列组合问题、搜索问题的算法&#xff0c;它的基本思想是将问题的解空间转化为一棵树&#xff0c;通过深度优先搜索的方式遍历树上的所有节点&#xff0c;找到符合条件的解。回溯算法通常使用递归实现&#xff0c;每次递归时传入…...

带你玩转Python爬虫(胆小者勿进)千万别做坏事·······

这节课很危险&#xff0c;哈哈哈哈&#xff0c;逗你们玩的 目录 写在前面 1 了解robots.txt 1.1 基础理解 1.2 使用robots.txt 2 Cookie 2.1 两种cookie处理方式 3 常用爬虫方法 3.1 bs4 3.1.1 基础介绍 3.1.2 bs4使用 3.1.2 使用例子 3.2 xpath 3.2.1 xpath基础介…...

【JavaScript 】严格模式,With关键字,测试框架介绍,assert

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录静态类型语言弱类型严格模式将过失错误转化为异常简化变量的使用With测试框架try-catch选择性捕获…...

mybatis实现一个简单的CRUD功能的小案例(后端)编写流程

下面是一个使用mybatis实现增删改查功能的示例程序&#xff1a; 1.创建一个数据库 首先需要创建一个名为test_db的数据库&#xff0c;里面包含一个名为user_info的表&#xff0c;其中包含id、name、age三个字段。 2.配置mybatis 在项目的pom.xml文件中添加mybatis和mysql依…...

腾讯云轻量应用服务器价格表(2023版)

2023腾讯云轻量应用服务器2核2G4M带宽88元一年、2核4G6M带宽159元/年、4核8G10M优惠价425元、8核16G14M价格1249、16核32G20M服务器2499元一年&#xff0c;今天分享2023腾讯云服务器配置及精准报价。 腾讯云轻量应用服务器优惠价格表 腾讯云服务器分为轻量应用服务器和云服务器…...

网络层IP协议和数据链路层

目录IP协议协议头格式分片网段划分特殊的IP地址IP地址的数量限制NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器私有IP地址和公网IP地址路由路由表生成算法数据链路层认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MT…...

零基础学习Java 03

目录 数组 动态初始化数组 静态初始化 数组的应用 数组两种典型的异常 length关键字求出数组的长度 数组遍历在IDEA中输出快捷语句 对象数组 数组的遍历&#xff1a;foreach方法 二维数组 枚举(enum) 数组 1在方法中可以返回一个数组&#xff0c;但是在定义方法时类型要…...

PG数据库超时退出 TCP设定

数据库在使用psql工具以及jdbc进行远程连接时&#xff0c;在经过一定时间之后报错-致命错误&#xff1a; terminating connection due to client no input timeout。 排查安全参数&#xff0c;hg_clientnoinput 0&#xff1b; 问题原因 操作系统TCP相关参数设置不正确&…...

每日学术速递4.4

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Baize: An Open-Source Chat Model with Parameter-Efficient Tuning on Self-Chat Data 标题&#xff1a;Baize&#xff1a;一种对自聊天数据进行参数高效调优的开源聊天模型 作者…...

ChatGPT将引发大量而普遍的网络安全隐患

ChatGPT是一个基于人工智能的语言生成模型&#xff0c;它可以在任何给定的时间&#xff0c;使用自然语言生成技术&#xff0c;生成文本、对话和文章。它不仅可以被用来编写文本&#xff0c;还可以用来编写语言、生成图像和视频。目前&#xff0c; ChatGPT已广泛应用于语言翻译、…...

购买学生护眼台灯几瓦最好?有哪些推荐护眼灯

现今的近视已然成为普遍现象&#xff0c;而且有往低年龄段发展的趋势。究其原因&#xff0c;长期使用电子设备是一方面&#xff0c;还是就是我们日常工作、学习、生活没有很好的护眼环境&#xff0c;很多时候我们不经意的错误习惯&#xff0c;久而久之就有可能诱发近视。对孩子…...

什么是 SYN 攻击?如何避免 SYN 攻击?

SYN 攻击方式最直接的表现就会把 TCP 半连接队列打满&#xff0c;这样当 TCP 半连接队列满了&#xff0c;后续再在收到 SYN 报文就会丢弃&#xff0c;导致客户端无法和服务端建立连接。 避免 SYN 攻击方式&#xff0c;可以有以下四种方法&#xff1a; 调大 netdev_max_backlo…...

数据分析练习——学习一般分析步骤

目录 一、准备工作 二、导入库和数据 1、导入必要的库&#xff1a; 2、模拟数据 三、数据分析过程 1、读取数据&#xff1a; 2、数据概览和描述性统计&#xff1a; 2.1、查看数据概览&#xff1a; 2.2、查看描述性统计&#xff1a; 3、数据清洗&#xff1a; 3.1、处…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...