muduo库base源码分析二 (原子性操作AtomicIntegerT类封装)

本文探讨了原子性操作在并发编程中的关键作用,通过场景分析和GCC提供的原子操作实例,解释了为何需要避免锁竞争并提倡使用如__sync_fetch_and_add等原子操作。同时,展示了如何在Muduo库中利用原子操作实现无锁队列,并介绍了volatile关键字的作用和编译选项对代码质量的影响。
摘要由CSDN通过智能技术生成

为什么需要原子性操作?

我们考虑这样一种场景,两个线程对同一个变量同时x++操作。

x++ 在计算机的步骤:从内存中读取x的值到寄存器中,对寄存器加1,再把新值写回x所处的内存地址。

假设有如下时序图:

两个线程运行结束后,x等于11,正确应该是12,那要得出正确的结果,有两个方法:

第一种是锁:在X++ 之前加一把锁,加完解锁。这样就可以保证在同一时刻只有一个线程进入临界区域,对X进行读的操作,写的操作,当一个线程进入这个临界区域的时候,其他线程就不能访问这个临界区的资源,只能等到占用的线程unlook 的时候才能进入。多个线程访问资源的时候势必会发生锁竞争。锁竞争是高性能服务器四大杀手之一,我们应该尽可能的减少锁的使用。原子性操作可以实现这一目标。

第二种原子操作:原子性操作可以把X++的3步骤看成一个整体。现代的CPU都提供了原子性操作的相关指令。

这些是GCC 提供的原子性操作,当然前提是CPU支持原子性操作的指令。

// 原子自增操作
type __sync_fetch_and_add (type *ptr, type value)

// 原子比较和交换(设置)操作
type __sync_val_compare_and_swap (type *ptr, type oldval type newval) 
boo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值