线程同步(互斥锁、死锁、读写锁、条件变量、信号量)

  1. 同步概念
    协同步调,按预定的先后次序运行
  • 线程同步
    image

image

image

  • 数据混乱原因

image

解决办法:在程序中实现就是互斥量
image


  1. 互斥量mutex

学习地址

image

image

也叫互斥锁(只有一把锁),抢到锁的可以访问共享数据;
image
线程不拿锁也可以访问共享数据,但是建议先拿锁再访问共享数据,避免数据混乱;

数据混乱示例:
image

image

  • 主要应用函数

image

参考文章

使用步骤:
image

拓展知识:
restrict 关键字,说的是只能用此指针修改指针所指的数据,即有没有操作权限;
参考文章1
参考文章2
参考文章3
const说的是读写权限

  • 加锁与解锁
  • 加锁步骤测试
    image

image

注意事项:
image

image


死锁
学习地址

使用锁不恰当;
image

image

结果程序不运行了;


  1. 读写锁(对比互斥锁,当读线程多时,访问效率高)
    锁只有一把;
    读共享,写独占;
    写锁优先级高(读锁、写锁一起争时,且没锁,都阻塞;);
    记住上面3句号即可!
    image

image

  • 读写锁状态
    image

  • 读写锁特性
    image

  • 主要应用函数
    image

  • 读写锁示例
    学习地址

image

image

image

image


  1. 条件变量

image

  • 主要应用函数
    image
    等待条件满足、通知、广播;
    实现“等待--->唤醒”逻辑;

初始化条件变量:
静态初始化
动态初始化
image
mutex也有这样的初始化

image
image

image

参考文章

image

示例代码:
image

image

多个消费者:
image
注意上图画圈处,有多个消费者时,需要为while(原因:需要判断公共区有没有数据

  • 条件变量的优点

  1. 信号量 semaphore
    与信号(signal)无关
    应用于线程、进程间同步
    image

image

image

  • 主要应用函数
    image
    image
    绝对时间
    image
    image

  • 生产者消费者信号量模型
    image

学习地址

image

image

image


posted @   我爱茜茜公主  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示