线程同步(互斥锁、死锁、读写锁、条件变量、信号量)
- 同步概念
协同步调,按预定的先后次序运行
- 线程同步
- 数据混乱原因
解决办法:在程序中实现就是互斥量
- 互斥量mutex
也叫互斥锁(只有一把锁),抢到锁的可以访问共享数据;
线程不拿锁也可以访问共享数据,但是建议先拿锁再访问共享数据,避免数据混乱;
数据混乱示例:
- 主要应用函数
使用步骤:
拓展知识:
restrict 关键字,说的是只能用此指针修改指针所指的数据,即有没有操作权限;
参考文章1
参考文章2
参考文章3
const说的是读写权限
- 加锁与解锁
- 加锁步骤测试
注意事项:
死锁
学习地址
使用锁不恰当;
结果程序不运行了;
- 读写锁(对比互斥锁,当读线程多时,访问效率高)
锁只有一把;
读共享,写独占;
写锁优先级高(读锁、写锁一起争时,且没锁,都阻塞;);
记住上面3句号即可!
-
读写锁状态
-
读写锁特性
-
主要应用函数
-
读写锁示例
学习地址
- 条件变量
- 主要应用函数
等待条件满足、通知、广播;
实现“等待--->唤醒”逻辑;
初始化条件变量:
静态初始化
动态初始化
mutex也有这样的初始化
- 生产者消费者条件变量
学习地址
示例代码:
多个消费者:
注意上图画圈处,有多个消费者时,需要为while(原因:需要判断公共区有没有数据)
- 条件变量的优点
- 信号量 semaphore
与信号(signal)无关
应用于线程、进程间同步
-
主要应用函数
绝对时间
-
生产者消费者信号量模型
如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为你正在走上坡路,走过去,你就一定会有进步。如果,你正在埋怨命运不眷顾,开导自己:命,是失败者的借口;运,是成功者的谦词。命运从来都是掌握在自己的手中,埋怨,只是一种懦弱的表现;努力,才是人生的态度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库