原子操作:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何context switch (切换到另一个线程)。
对于一个整数类型T,sync/atomic标准包提供了下列原子操作函数。其中T可以是内置int32,int64,uint32,uint64和uintptr
func AddT(addr *T, delta T)(new T)
func LoadT(addr *T) (val T)
func StoreT(addr *T, val T)
func SwapT(addr *T, new T) (old T)
func CompareAndSwapT(addr *T, old, new T) (swapped bool)
sync/atomic标准包也提供了Value类型。以它为基的指针类型*Value有两种方法:
func (v *Value) Load() (x interface{})
func (v *Value) Store(x interface{})
- AddT
对T类型的数据做原子的add操作。explame
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var num uint64
var g sync.WaitGroup
for i:=0 ; i < 10000; i++ {
g.Add(1)
go func() {
defer g.Done()
atomic.AddUint64(&num, 1)
}()
}
g.Wait()
fmt.Print(num)
}
- Store and Load
类似于get以及set操作