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