东莞政务网站建设方案,wordpress三栏博客主题,网站登录密码忘记,网站建设专题页面1.atomic.Pointer
atomic.Pointer 是 Go 语言标准库 sync/atomic 提供的一种原子指针类型。它用于在并发环境中对指针进行原子操作#xff0c;以确保线程安全性。
什么是原子操作#xff1f;golang 的原子操作
在多线程编程中#xff0c;当多个线程同时访问和修改同一个…1.atomic.Pointer
atomic.Pointer 是 Go 语言标准库 sync/atomic 提供的一种原子指针类型。它用于在并发环境中对指针进行原子操作以确保线程安全性。
什么是原子操作golang 的原子操作
在多线程编程中当多个线程同时访问和修改同一个共享变量时可能会引发竞态条件Race Condition和数据竞争Data Race等问题。为了避免这些问题Go 语言提供了原子操作来确保对共享变量的原子性访问和修改。
type tradeHistory struct {latestPopTrade atomic.Pointer[utils.Trade]latestTrade atomic.Pointer[utils.Trade]
}
2. 原子操作函数
atomic.Pointer 类型实际上是一个指向任意类型的指针它提供了以下原子操作函数来访问和修改指针的值 func LoadPointer(addr *unsafe.Pointer) (p unsafe.Pointer) LoadPointer 函数用于原子地读取指针的值并返回读取的值。参数 addr 是一个指向 unsafe.Pointer 类型的指针表示要读取的指针的地址。 func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer) StorePointer 函数用于原子地存储指针的值。参数 addr 是一个指向 unsafe.Pointer 类型的指针表示要存储的指针的地址。参数 val 是要存储的指针的值。 func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer) SwapPointer 函数用于原子地交换指针的值并返回原来的值。参数 addr 是一个指向 unsafe.Pointer 类型的指针表示要交换值的指针的地址。参数 new 是要替换的新值。返回值是原来的指针值。
通过使用这些原子操作函数可以在多线程环境中对指针进行原子读取、存储和交换操作从而保证对共享指针的线程安全访问。
3. store和load方法详解
由于这两个方法用得比较多在 Go 语言中.Store 和 .Load 是 sync/atomic 包提供的原子操作函数用于对变量进行原子的存储和加载操作。
Store 函数用于原子存储写入变量的值 func StoreT(addr *T, val T) (1)Store 函数用于原子地将 val 存储到 addr 所指向的变量中。 (2) 参数 addr 是一个指向要存储值的变量的指针。 (3) 参数 val 是要存储的值类型必须与 addr 指向的变量类型相同。
Load 函数用于原子加载读取变量的值。 func LoadT(addr *T) T (1)Load 函数用于原子地加载 addr 所指向的变量的值。 (2)参数 addr 是一个指向要加载值的变量的指针。 (3)返回值是加载的值类型与 addr 指向的变量类型相同。
func (t *tradeHistory) addTrade(trade *utils.Trade) {if t.latestTrade.Load() nil {t.latestTrade.Store(trade)return}if t.latestButOneTrade.Load() nil {t.latestButOneTrade.Store(t.latestTrade.Load())t.latestTrade.Store(trade)return}t.latestButOneTrade.Store(t.latestTrade.Load())t.latestTrade.Store(trade)t.tradeHisBase.addTrade(trade)t.maxVolPrc.AddTrade(trade)t.sortHisPrc.Add(trade.GetPrc())t.sortHisNotional.Add(trade.GetAmt())t.prcDiffQueue.Add(trade.GetPrc()/t.latestButOneTrade.Load().GetPrc() - 1)
}