当前位置: 首页 > 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、处…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...