golang中的原子操作atomic包

技术golang中的原子操作atomic包 golang中的原子操作atomic包1. 概念 原子操作 atomic 包 加锁操作涉及到内核态的上下文切换,比较耗时,代价高, 针对基本数据类型我们还可以

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

(0)

相关推荐

  • 分析DevOps生命周期

    技术分析DevOps生命周期这篇文章主要介绍“分析DevOps生命周期”,在日常操作中,相信很多人在分析DevOps生命周期问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析DevOps生

    攻略 2021年11月5日
  • linux中rpm安装

    技术linux中rpm安装 linux中rpm安装目录一:linux中rpm安装1.rpm简介2.区别3.RPM命令五种基本模式二:RPM安装全面解析1,下载软件包2, 安装软件包3, 尝试卸载4, 更

    礼包 2021年12月17日
  • 抖音粉丝哪里买,哪里有专门卖抖音粉丝的

    技术抖音粉丝哪里买,哪里有专门卖抖音粉丝的抖音是否能够刷粉,网站即可刷到粉丝,现如今抖音粉丝是大家比较关注的问题,只要在代刷网刷粉想要多少可以刷多少,粉丝都是活跃粉丝,都是真人粉丝。
    抖音在短视频app中是最大人流量之一

    测评 2021年10月20日
  • 怎样使用Clustal进行多序列比对

    技术怎样使用Clustal进行多序列比对怎样使用Clustal进行多序列比对,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。多序列比对在保守区域鉴定,系统发育

    攻略 2021年11月10日
  • hot的比较级,形容词比较级双写+er的有哪些

    技术hot的比较级,形容词比较级双写+er的有哪些在重读闭音节(即:辅音+元音+辅音)中hot的比较级,要双写结尾的辅音字母,然后比较级加er,列举如下:bigger,thinner,fatter,hotter,slim

    生活 2021年10月29日
  • C语言中提高代码执行效率的小技巧有哪些

    技术C语言中提高代码执行效率的小技巧有哪些本篇内容主要讲解“C语言中提高代码执行效率的小技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中提高代码执行效率的小技

    攻略 2021年11月9日