无锁编程技术(一)

本文探讨了多线程编程中锁的使用及其效率问题,解释了无锁编程的必要性和优势。通过分析锁的性能开销,如模式切换和上下文切换,指出无锁编程能减少这些开销。介绍了无锁编程的关键技术,如原子操作、内存栅栏和CAS,并警告了无锁编程的潜在缺点,如循环CAS带来的CPU占用和实现的复杂性。最后,建议在特定场景下谨慎使用无锁编程技术。
摘要由CSDN通过智能技术生成

一、为什么要锁?

多线程编程有资源竞争。比如,线程A要在一个链表增删节点,线程B也要增删该链表,就可能相互踩踏。一种解决方案是,保证同一时刻只有一个线程在操作,操作完成之后其他线程再操作。锁的意义就是,拿到竞争资源的线程上锁,以保证独占该资源。其他线程要使用该资源,首先查看资源是否被锁,是就等待锁释放。

二、为什么要多线程编程?

程序有CPU密集型和IO密集型。有些工作需要等待IO或者其他条件,此时,该线程应该让出CPU以提高CPU效率(干等着是浪费CPU)。

三、为什么要无锁?

锁会使得应用低效,很多时候,锁就是应用瓶颈所在。

四、为什么锁会低效?

首先,上锁和释放锁,都需要模式切换,本身就是开销。上锁:由用户空间切换到内核空间,上锁后再切回到用户空间,这就是两次切换;释放锁也同样需要两次模式切换,一共是四次模式切换。

另一个开销,在于进程上下文的切换。线程切换有两种场景:CPU时间片用尽、因阻塞被提前切换。拿竞争资源失败导致阻塞,会使得调度单元放弃未使用完的CPU时间片而切换到其他调度单元。也就是说,因为锁的缘故,导致上下文的切换更多了。无锁并发和CAS并不是说避免了上下文切换,而是减少了上下文切换。即,无锁并发则只有时间片用完后才进行线程切换。

1、线程运行的时间片时间用完了,线程切换。
2、若线程在时间片结束前阻塞或结束,线程切换。

上下文切换需要保存、回复现场,这些都是CPU开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值