深入了解Golang atomic原子操作
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(上下文切换)。在 Golang 中,提供了一些原子级别的操作,可以通过 sync/atomic
包来实现。
以下是一些使用 sync/atomic
包的示例:
- 解决数值的原子增加:
var value int32
func increment() int32 {
return atomic.AddInt32(&value, 1)
}
在这个例子中,AddInt32
函数将 &value 的值增加 1,并返回新的值。这个操作是原子的,意味着在多线程环境下,不会发生竞态条件。
- 解决数值的原子减少:
var value int32
func decrement() int32 {
return atomic.AddInt32(&value, -1)
}
AddInt32
函数也可以用来减少值。
- 解决指针的原子更新:
type MyStruct struct {
value int
}
var ptr *MyStruct
func update() {
newVal := &MyStruct{value: 10}
atomic.StorePointer(&ptr, unsafe.Pointer(newVal))
}
在这个例子中,StorePointer
函数将 ptr 指针更新为指向 newVal 的地址。
- 解决布尔值的原子更新:
var boolean int32
func toggle() bool {
for {
old := atomic.LoadInt32(&boolean)
new := atomic.LoadInt32(&boolean)
if atomic.CompareAndSwapInt32(&boolean, old, !new) {
return !new
}
}
}
在这个例子中,CompareAndSwapInt32
函数会检查 boolean 是否等于 old,如果相等,则将其更新为 new,此操作是原子的。
- 解决数值的原子加载:
var value int32
func load() int32 {
return atomic.LoadInt32(&value)
}
LoadInt32
函数用于加载 value 的当前值,这个操作是原子的。
以上就是一些使用 sync/atomic
包的基本示例。这个包提供了一系列的函数来处理不同类型的原子操作。
评论已关闭