线程间同步方式有哪些?

线程间同步方式有哪些?

同一进程内的多个线程共享同一地址空间,为了避免多个线程同时访问数据造成的混乱,需要考虑线程之间的同步问题,所谓同步,即协同步调,按预定的先后次序访问共享资源,以免造成混乱。

线程同步的实现方式主要有6种:互斥锁、自旋锁、读写锁、条件变量、屏障、信号量。

1、互斥锁。互斥锁在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量进行解锁。对互斥量加锁以后,任何其他试图再次对互斥量加锁的线程都会被阻塞,直至当前线程释放该互斥量。

2、自旋锁。自旋锁与互斥量类似,但它不使线程进入阻塞态,而是在获取锁之前一直占用CPU,处于忙等自旋状态。自旋锁适用于锁被持有的时间短且线程不希望在重新调度上花费太多成本的情况。

3、读写锁。读写锁有三种状态:读模式加锁、写模式加锁和不加锁,一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。读写锁非常适合对数据结构读的次数远大于写的情况。

4、条件变量。条件变量允许线程睡眠,直到满足某种条件,当满足条件时,可以向该线程发送信号,通知并唤醒该线程。条件变量通常与互斥量配合一起使用。条件变量由互斥量保护,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到条件的改变,因为必须在锁住互斥量之后它才可以计算条件是否发生变化。

5、屏障。屏障是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都到达某一点,然后从该点继续执行。

6、信号量。信号量本质上是一个计数器,用于为多个进程提供共享数据对象的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。

笔记摘自:

https://www.bilibili.com/video/BV19m4y1N7VK/?spm_id_from=333.788&vd_source=909fa6b31085b895e8466647f418152c

bilibili上视频

参考文章:

【C++】锁_c++ 锁-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值