golang中的原子操作原子的包
1.概念
原子操作原子的包
加锁操作涉及到内核态的上下文切换,比较耗时,代价高,
针对基本数据类型我们还可以使用原子操作来保证并发的安全,
因为原子操作是去语言提供的方法,我们在用户态就可以完成,因此性能比加锁操作更好
去语言的原子操作由内置的库同步/原子完成
2.原子的包
方法解释func load int 32(addrint 32)(val int 32)
func LoadInt 64(addr ` int 64)(val int 64)brfunc Loaduint32(addruint32)(val uint32)brfunc Loaduint64(addruint64)(val uint64)brfunc Loaduintptr(addruintptr)(val uintptr)brfunc LoadPoint(addrunsafe .指针`)(val不安全。指针)
读取操作
func StoreInt32(addr*int32,val int32)
func StoreInt64(addr*int64,val int64)
func StoreUint32(addr*uint32,val uint32)
func StoreUint64(addr*uint64,val uint64)
func StoreUintptr(addr*uintptr,val uintptr)
函数存储指针(addr *不安全。指针瓦尔不安全。指针)
写入操作
func AddInt32(addr*int32,delta int32)(新Int32)
func AddInt64(addr*int64,delta int64)(新Int64)
func AddUint32(addr*uint32,delta uint32)(新Uint32)
func AddUint64(addr*uint64,delta uint64)(新Uint64)
func AddUintptr(addr*Uintptr,delta uintptr)(新uintptr)
修改操作
func SwapInt32(addr*int32,new int32) (old int32)
func SwapInt64(addr*int64,new int64) (old int64)
func Swapuit 32(addr * uint 32,新Uint32()旧uint32)
func SwapUint64(addr*uint64,新Uint64()旧uint64)
func SwapUintptr(addr*Uintptr,new uintptr)(旧uintptr)
func SwapPointer(addr *不安全。指针,新的不安全。指针)(旧的不安全。指针)
交换操作
func compareandswapint 32(addr * int 32,旧的,新的int 32()已交换bool)
func compareandswapint 64(addr * int 64,旧的,新的int 64()已交换bool)
func CompareAndSwapUint32(addr * Uint 32,旧的,新的uint 32()已交换bool)
func CompareAndSwapUint64(addr * Uint 64,旧的,新的uint 64()已交换bool)
func CompareAndSwapUintptr(addr * Uintptr,旧的,新的uintptr()交换的bool)
func CompareAndSwapPointer(addr *不安全。指针,旧的,新的不安全。指针)(交换的bool)
3.案例比较互斥锁和原子操作的性能
包装主体
导入(
fmt '
同步
"同步/原子"
时间
)
var(
x int64
不愿具体说明自己性别的人士使用的称谓同步。互斥(体)…
工作组同步等待组.
)
//普通函数,并发不安全
func Add(){ 0
x
工作组。完成()
}
//互斥锁,并发安全,性能低于原子操作
func MxAdd(){ 0
mx .锁定()
x
mx .解锁()
工作组。完成()
}
//原子操作,并发安全,性能高于互斥锁,只针对去中的一些基本数据类型使用
func Amadd(){ 0
原子的附件64(x,1)
工作组。完成()
}
func main(){ 0
//原子操作原子的包
//加锁操作涉及到内核态的上下文切换,比较耗时,代价高,
//针对基本数据类型我们还可以使用原子操作来保证并发的安全,
//因为原子操作是去语言提供的方法,我们在用户态就可以完成,因此性能比加锁操作更好
//开始语言的原子操作由内置的库同步/原子完成
开始:=时间。现在()
对于I :=0;我10000;我
工作组。添加(1)
//转到Add() //普通版增加函数不是并发安全的
//go MxAdd() //加锁版增加函数,是并发安全的,但是加锁性能开销大
go AmAdd() //原子操作版增加函数,是并发安全的,性能优于加锁版
}
end :=时间。现在()
工作组。等待()
fmt .Println(x)
fmt .Println(结束.Sub(开始))
}
原子的包提供了底层的原子级内存操作,对于同步算法的实现很有用,这些函数必须谨慎的保证正确使用,除了某些特殊的底层应用,使用通道或者同步包的函数/类型实现同步更好
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/79567.html