线程同步问题——锁

文章目录

    • 线程同步
    • 互斥锁(互斥量)
      • 相关操作函数
      • 应用
    • 死锁
    • 读写锁
      • 相关操作函数

线程同步

线程同步问题——锁_第1张图片
临界区——代码
临界数据——共享数据
原子操作:不可以被其他操作打断
必须的,用以保证数据的安全性
实现线程同步的方式:

  1. 互斥量(互斥锁)——死锁
  2. 读写锁——多读一写

互斥锁(互斥量)

线程同步问题——锁_第2张图片
线程同步问题——锁_第3张图片

相关操作函数

线程同步问题——锁_第4张图片
线程同步问题——锁_第5张图片
在这里插入图片描述
不能采用另外的指针对mutex操作。
线程同步问题——锁_第6张图片

应用

  1. 全局区创建互斥量
  2. 主线程初始化
  3. 主线程阻塞——连接终止子线程
  4. 找到操作共享数据的位置(操作位置,不是定义位置)
  5. 在开始操作前 加锁
  6. 在操作结束后 解锁
  7. 主线程释放互斥量
    注意:主线程return 0;对子线程有影响,导致其直接结束了。可以使用pthread_exit(NULL);终止主线程。

死锁

线程同步问题——锁_第7张图片
死锁:因争夺共享资源而造成的一种等待的现象。
死锁场景:(加锁同一组互斥量时,就可能发生死锁)

  1. 忘记释放锁——可以使用 尝试加锁 不阻塞代码
  2. 重复加锁
  3. 多线程多锁,抢占锁资源——一个线程使用多个资源多个锁

读写锁

线程同步问题——锁_第8张图片
读写锁效率比互斥锁高,读锁并发执行,不会进行阻塞。

相关操作函数

线程同步问题——锁_第9张图片

rwlock:读写锁
rdlock:读锁
·wrlock`:写锁

你可能感兴趣的:(Linux,性能优化,开发语言,linux,笔记,学习)