并发编程中的互斥与自旋互斥异同

       在现在多处理器多核模式架构的CPU下,多线程并发编程是系统编程程序员必须要掌握的技能。在数据同步中,用得比较多的就有互斥。
       在早期的系统中,只有互斥,后来增加了自旋互斥,那么这个互斥和自旋互斥有什么区别呢,到底怎么选择二者呢?
       提到互斥,不得不提到线程的上下文切换,线程上下文切换是有代价的,需要进入内核模式,要保存线程的相关数据与状态,以及寄存器数据,程序计数器等内容。
       互斥的实现基础,是基于硬件提供的compare-and-swap 指令,或者类似的指令。其本质是锁住内存地址总线,禁止短时间的中断来实现的。所以互斥的实现是由硬件提供直接基础的,不是纯由系统软件实现。
       基于互斥的实现基础,互斥适合于快速获得和释放的场景。
       现在流行的做法,是把互斥分成两类:阻塞和非阻塞。
       其中,非阻塞的互斥又称为自旋,因为自旋互斥如果没有获取它需要的锁,它会一直不断循环检测,直到取得互斥锁为止,
自旋互斥在运行期间,底层cpu禁止中断,不然会引入死锁。
       阻塞互斥与自旋互斥的区别在于:
       阻塞互斥如果没有获得锁,会进入睡眠状态,从而可能进行上下文切换,代价会大一些。
       自旋互斥如果没有获得锁,会不断循环检测,不会进入上下文切换,直到获得请求的锁,代价小一些,但是可能浪费CPU时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值