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

读写锁解决Redis缓存问题 读写锁死锁_数据

读写锁解决Redis缓存问题 读写锁死锁_条件变量_02

  • 数据混乱原因

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_03

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

读写锁解决Redis缓存问题 读写锁死锁_读写锁_04


  1. 互斥量mutex

学习地址

读写锁解决Redis缓存问题 读写锁死锁_条件变量_05

读写锁解决Redis缓存问题 读写锁死锁_读写锁_06

也叫互斥锁(只有一把锁),抢到锁的可以访问共享数据;

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_07


线程不拿锁也可以访问共享数据,但是建议先拿锁再访问共享数据,避免数据混乱;数据混乱示例:

读写锁解决Redis缓存问题 读写锁死锁_读写锁_08

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_09

  • 主要应用函数

读写锁解决Redis缓存问题 读写锁死锁_数据_10

参考文章

使用步骤:

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_11

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

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

读写锁解决Redis缓存问题 读写锁死锁_条件变量_12

注意事项:

读写锁解决Redis缓存问题 读写锁死锁_条件变量_13

读写锁解决Redis缓存问题 读写锁死锁_数据_14


死锁
学习地址

使用锁不恰当;

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_15

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_16

结果程序不运行了;


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

读写锁解决Redis缓存问题 读写锁死锁_读写锁_17

  • 读写锁状态
  • 读写锁解决Redis缓存问题 读写锁死锁_读写锁_18

  • 读写锁特性
  • 读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_19

  • 主要应用函数
  • 读写锁解决Redis缓存问题 读写锁死锁_读写锁_20

  • 读写锁示例
    学习地址

读写锁解决Redis缓存问题 读写锁死锁_读写锁_21

读写锁解决Redis缓存问题 读写锁死锁_读写锁_22

读写锁解决Redis缓存问题 读写锁死锁_读写锁_23

读写锁解决Redis缓存问题 读写锁死锁_读写锁_24


  1. 条件变量

读写锁解决Redis缓存问题 读写锁死锁_数据_25

  • 主要应用函数

    等待条件满足、通知、广播;
    实现“等待--->唤醒”逻辑;

初始化条件变量:

静态初始化

动态初始化

读写锁解决Redis缓存问题 读写锁死锁_条件变量_26


mutex也有这样的初始化

读写锁解决Redis缓存问题 读写锁死锁_条件变量_27


读写锁解决Redis缓存问题 读写锁死锁_数据_28

读写锁解决Redis缓存问题 读写锁死锁_读写锁_29

参考文章

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_30

示例代码:

读写锁解决Redis缓存问题 读写锁死锁_条件变量_31

读写锁解决Redis缓存问题 读写锁死锁_条件变量_32

多个消费者:

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_33


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

  • 条件变量的优点

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

读写锁解决Redis缓存问题 读写锁死锁_数据_34

读写锁解决Redis缓存问题 读写锁死锁_读写锁解决Redis缓存问题_35

  • 主要应用函数
  • 读写锁解决Redis缓存问题 读写锁死锁_数据_36


  • 读写锁解决Redis缓存问题 读写锁死锁_读写锁_37


  • 绝对时间
  • 读写锁解决Redis缓存问题 读写锁死锁_条件变量_38


  • 读写锁解决Redis缓存问题 读写锁死锁_条件变量_39

  • 生产者消费者信号量模型
  • 读写锁解决Redis缓存问题 读写锁死锁_读写锁_40

学习地址

读写锁解决Redis缓存问题 读写锁死锁_条件变量_41

读写锁解决Redis缓存问题 读写锁死锁_读写锁_42

读写锁解决Redis缓存问题 读写锁死锁_条件变量_43


如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为你正在走上坡路,走过去,你就一定会有进步。如果,你正在埋怨命运不眷顾,开导自己:命,是失败者的借口;运,是成功者的谦词。命运从来都是掌握在自己的手中,埋怨,只是一种懦弱的表现;努力,才是人生的态度。