加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang原子库atomic

发布时间:2020-12-16 18:40:50 所属栏目:大数据 来源:网络整理
导读:packageatomicimport("unsafe")//BUG(rsc):Onx86-32,the64-bitfunctionsuseinstructionsunavailablebeforethePentiumMMX.////Onnon-LinuxARM,the64-bitfunctionsuseinstructionsunavailablebeforetheARMv6kcore.////OnbothARMandx86-32,itisthecaller'srespo
packageatomic

import(
	"unsafe"
)

//BUG(rsc):Onx86-32,the64-bitfunctionsuseinstructionsunavailablebeforethePentiumMMX.
//
//Onnon-LinuxARM,the64-bitfunctionsuseinstructionsunavailablebeforetheARMv6kcore.
//
//OnbothARMandx86-32,itisthecaller'sresponsibilitytoarrangefor64-bit
//alignmentof64-bitwordsaccessedatomically.Thefirstwordinaglobal
//variableorinanallocatedstructorslicecanbereliedupontobe
//64-bitaligned.

//SwapInt32atomicallystoresnewinto*addrandreturnstheprevious*addrvalue.
funcSwapInt32(addr*int32,newint32)(oldint32)

//SwapInt64atomicallystoresnewinto*addrandreturnstheprevious*addrvalue.
funcSwapInt64(addr*int64,newint64)(oldint64)

//SwapUint32atomicallystoresnewinto*addrandreturnstheprevious*addrvalue.
funcSwapUint32(addr*uint32,newuint32)(olduint32)

//SwapUint64atomicallystoresnewinto*addrandreturnstheprevious*addrvalue.
funcSwapUint64(addr*uint64,newuint64)(olduint64)

//SwapUintptratomicallystoresnewinto*addrandreturnstheprevious*addrvalue.
funcSwapUintptr(addr*uintptr,newuintptr)(olduintptr)

//SwapPointeratomicallystoresnewinto*addrandreturnstheprevious*addrvalue.
funcSwapPointer(addr*unsafe.Pointer,newunsafe.Pointer)(oldunsafe.Pointer)

//CompareAndSwapInt32executesthecompare-and-swapoperationforanint32value.
funcCompareAndSwapInt32(addr*int32,old,newint32)(swappedbool)

//CompareAndSwapInt64executesthecompare-and-swapoperationforanint64value.
funcCompareAndSwapInt64(addr*int64,newint64)(swappedbool)

//CompareAndSwapUint32executesthecompare-and-swapoperationforauint32value.
funcCompareAndSwapUint32(addr*uint32,newuint32)(swappedbool)

//CompareAndSwapUint64executesthecompare-and-swapoperationforauint64value.
funcCompareAndSwapUint64(addr*uint64,newuint64)(swappedbool)

//CompareAndSwapUintptrexecutesthecompare-and-swapoperationforauintptrvalue.
funcCompareAndSwapUintptr(addr*uintptr,newuintptr)(swappedbool)

//CompareAndSwapPointerexecutesthecompare-and-swapoperationforaunsafe.Pointervalue.
funcCompareAndSwapPointer(addr*unsafe.Pointer,newunsafe.Pointer)(swappedbool)

//AddInt32atomicallyaddsdeltato*addrandreturnsthenewvalue.
funcAddInt32(addr*int32,deltaint32)(newint32)

//AddUint32atomicallyaddsdeltato*addrandreturnsthenewvalue.
//Tosubtractasignedpositiveconstantvaluecfromx,doAddUint32(&x,^uint32(c-1)).
//Inparticular,todecrementx,^uint32(0)).
funcAddUint32(addr*uint32,deltauint32)(newuint32)

//AddInt64atomicallyaddsdeltato*addrandreturnsthenewvalue.
funcAddInt64(addr*int64,deltaint64)(newint64)

//AddUint64atomicallyaddsdeltato*addrandreturnsthenewvalue.
//Tosubtractasignedpositiveconstantvaluecfromx,doAddUint64(&x,^uint64(c-1)).
//Inparticular,^uint64(0)).
funcAddUint64(addr*uint64,deltauint64)(newuint64)

//AddUintptratomicallyaddsdeltato*addrandreturnsthenewvalue.
funcAddUintptr(addr*uintptr,deltauintptr)(newuintptr)

//LoadInt32atomicallyloads*addr.
funcLoadInt32(addr*int32)(valint32)

//LoadInt64atomicallyloads*addr.
funcLoadInt64(addr*int64)(valint64)

//LoadUint32atomicallyloads*addr.
funcLoadUint32(addr*uint32)(valuint32)

//LoadUint64atomicallyloads*addr.
funcLoadUint64(addr*uint64)(valuint64)

//LoadUintptratomicallyloads*addr.
funcLoadUintptr(addr*uintptr)(valuintptr)

//LoadPointeratomicallyloads*addr.
funcLoadPointer(addr*unsafe.Pointer)(valunsafe.Pointer)

//StoreInt32atomicallystoresvalinto*addr.
funcStoreInt32(addr*int32,valint32)

//StoreInt64atomicallystoresvalinto*addr.
funcStoreInt64(addr*int64,valint64)

//StoreUint32atomicallystoresvalinto*addr.
funcStoreUint32(addr*uint32,valuint32)

//StoreUint64atomicallystoresvalinto*addr.
funcStoreUint64(addr*uint64,valuint64)

//StoreUintptratomicallystoresvalinto*addr.
funcStoreUintptr(addr*uintptr,valuintptr)

//StorePointeratomicallystoresvalinto*addr.
funcStorePointer(addr*unsafe.Pointer,valunsafe.Pointer)

//HelperforARM.Linkerwilldiscardonothersystems
funcpanic64(){
	panic("sync/atomic:broken64-bitatomicoperations(buggyQEMU)")
}

所有这些操作都是atomic,原子执行的操作,golang底层实

比如:

swap函数相当于(并且是原子执行的):

old = *addr

*addr = new

return old

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读