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 两种类型的多任务处理:基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 线程 c11以后有了 标准库 1 函数 2 类成员函数 3 lambda函…...
STM32F103制作FlashDriver
文章目录前言芯片内存定义实现过程FlashDriver生成段定义擦除函数写入函数编译后的map手动测试HexView提取指定地址内容并重映射总结前言 在汽车行业控制器软件刷新流程中,一般会将Flash驱动单独进行刷写,目的是防止程序中一直存在Flash驱动的话&#x…...
springboot树形结构接口, 懒加载实现
数据库关系有父子id的, 作为菜单栏展示时需要用前端需要用到懒加载, 所谓懒加载就是接口有一个标志位isLeaf, 前端请求后通过该字段判断该节点是否还有子节点数据 创建数据库表 t_company_info结构有id和parentId标识, 用来表示父子关系 /*Navicat Premium Data TransferSourc…...
java企业级信息系统开发学习笔记02初探spring——利用组件注解符精简spring配置文件
文章目录一、学习目标二、打开01的项目三、利用组件注解符精简spring配置文件(一)创建新包,复制四个类(二)修改杀龙任务类(三)修改救美任务类(四)修改勇敢骑士类…...
用Python发送电子邮件?这也太丝滑了吧(21)
小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 猫爸赚钱养家,细想起来真的不容易啊! 起早贪黑,都是6点早起做早饭,送…...
分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测
分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测分类效果模型描述程序设计参考资料分类效果 模型描述 Matlab实现CNN-GRU-Attention多变量分类预测 1.data为数据集,格式为excel,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 回溯算法的部分总结
回溯算法的部分总结 回溯算法是一种常用于解决排列组合问题、搜索问题的算法,它的基本思想是将问题的解空间转化为一棵树,通过深度优先搜索的方式遍历树上的所有节点,找到符合条件的解。回溯算法通常使用递归实现,每次递归时传入…...
带你玩转Python爬虫(胆小者勿进)千万别做坏事·······
这节课很危险,哈哈哈哈,逗你们玩的 目录 写在前面 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: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录静态类型语言弱类型严格模式将过失错误转化为异常简化变量的使用With测试框架try-catch选择性捕获…...
mybatis实现一个简单的CRUD功能的小案例(后端)编写流程
下面是一个使用mybatis实现增删改查功能的示例程序: 1.创建一个数据库 首先需要创建一个名为test_db的数据库,里面包含一个名为user_info的表,其中包含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元一年,今天分享2023腾讯云服务器配置及精准报价。 腾讯云轻量应用服务器优惠价格表 腾讯云服务器分为轻量应用服务器和云服务器…...
网络层IP协议和数据链路层
目录IP协议协议头格式分片网段划分特殊的IP地址IP地址的数量限制NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器私有IP地址和公网IP地址路由路由表生成算法数据链路层认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MT…...
零基础学习Java 03
目录 数组 动态初始化数组 静态初始化 数组的应用 数组两种典型的异常 length关键字求出数组的长度 数组遍历在IDEA中输出快捷语句 对象数组 数组的遍历:foreach方法 二维数组 枚举(enum) 数组 1在方法中可以返回一个数组,但是在定义方法时类型要…...
PG数据库超时退出 TCP设定
数据库在使用psql工具以及jdbc进行远程连接时,在经过一定时间之后报错-致命错误: terminating connection due to client no input timeout。 排查安全参数,hg_clientnoinput 0; 问题原因 操作系统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 标题:Baize:一种对自聊天数据进行参数高效调优的开源聊天模型 作者…...
ChatGPT将引发大量而普遍的网络安全隐患
ChatGPT是一个基于人工智能的语言生成模型,它可以在任何给定的时间,使用自然语言生成技术,生成文本、对话和文章。它不仅可以被用来编写文本,还可以用来编写语言、生成图像和视频。目前, ChatGPT已广泛应用于语言翻译、…...
购买学生护眼台灯几瓦最好?有哪些推荐护眼灯
现今的近视已然成为普遍现象,而且有往低年龄段发展的趋势。究其原因,长期使用电子设备是一方面,还是就是我们日常工作、学习、生活没有很好的护眼环境,很多时候我们不经意的错误习惯,久而久之就有可能诱发近视。对孩子…...
什么是 SYN 攻击?如何避免 SYN 攻击?
SYN 攻击方式最直接的表现就会把 TCP 半连接队列打满,这样当 TCP 半连接队列满了,后续再在收到 SYN 报文就会丢弃,导致客户端无法和服务端建立连接。 避免 SYN 攻击方式,可以有以下四种方法: 调大 netdev_max_backlo…...
数据分析练习——学习一般分析步骤
目录 一、准备工作 二、导入库和数据 1、导入必要的库: 2、模拟数据 三、数据分析过程 1、读取数据: 2、数据概览和描述性统计: 2.1、查看数据概览: 2.2、查看描述性统计: 3、数据清洗: 3.1、处…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
