请说一下Go 原子操作有哪些?
Go语言中的原子操作主要由sync/atomic
包提供,它包含了一系列的函数,可以在多线程环境中安全地操作一些基本的数据类型。以下列出了一些主要的原子操作函数:
AddInt32
、AddInt64
、AddUint32
、AddUint64
、AddUintptr
:这些函数可以安全地将一个值加到一个整数或者指针。-
CompareAndSwapInt32
、CompareAndSwapInt64
、CompareAndSwapUint32
、CompareAndSwapUint64
、CompareAndSwapUintptr
、CompareAndSwapPointer
:这些函数实现了Compare And Swap(CAS)操作。CAS是一种无锁的技术,当多个线程尝试使用共享数据时,CAS能够检测到其他线程是否已经改变了这个数据。 -
LoadInt32
、LoadInt64
、LoadUint32
、LoadUint64
、LoadUintptr
、LoadPointer
:这些函数可以安全地读取一个整数或者指针的值。 -
StoreInt32
、StoreInt64
、StoreUint32
、StoreUint64
、StoreUintptr
、StorePointer
:这些函数可以安全地设置一个整数或者指针的值。 -
SwapInt32
、SwapInt64
、SwapUint32
、SwapUint64
、SwapUintptr
、SwapPointer
:这些函数可以安全地交换一个整数或者指针的值。
以上的所有函数都是并发安全的,可以在多线程环境中使用。这些原子操作在实现无锁数据结构,比如计数器、循环队列等场景中非常有用。