概述
为了保证并发安全,除了使用临界区之外,还可以使用原子操作。顾名思义这类操作满足原子性,其执行过程不能被中断,这也就保证了同一时刻一个线程的执行不会被其他线程中断,也保证了多线程下数据操作的一致性。
在atomic包中对几种基础类型提供了原子操作,包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer。对于每一种类型,提供了五类原子操作分别是
- Add, 增加和减少
- CompareAndSwap, 比较并交换
- Swap, 交换
- Load , 读取
- Store, 存储
具体函数名由原子操作名和类型关键字组成,例如对于int32的Add操作,函数名为AddInt32,其他函数名以此类推,后文中仅以int32类型系列函数为例进行说明,其他类型函数功能类似。
AddInt32
AddInt32可以实现对元素的原子增加或减少,其函数定义如下,函数接收两个参数,分别是需要修改的变量的地址和修改的差值,函数会直接在传递的地址上进行修改操作,此外函数会返回修改之后的新值:
func AddInt32(addr *int32, delta int32) (new