【发布时间】:2016-08-15 06:28:12
【问题描述】:
我有带有count 属性的结构需要线程安全访问。
我知道可以使用sync.Mutex 或sync.RWMutex 来完成。但我不确定这样是否可以:
type Status struct {
count uint32
attr1 string
attr2 string
}
func (s *Status) Get() uint32 {
return atomic.LoadUint32(&s.count)
}
func (s *Status) Add(n uint32) {
atomic.AddUint32(&s.count, n)
}
func (s *Status) Reset(n uint32) {
atomic.StoreUint32(&s.count, n)
}
谢谢。
编辑:
我很困惑直接访问字段s.count 是不安全的。但是atomic.LoadUint32(&s.count) 安全吗?
【问题讨论】:
-
访问任何语言的任何字段都是不安全的——除了一些纯函数式语言,如 Erlang 和 Elixir 或 Haskell 或一些具有复杂类型系统的语言,它们将并发视为其类型系统的一部分,如 Pony 或一些像 Rust 这样的“提供”意味着使并发访问安全的语言。因此,在使用常用/主流编程语言时,您应该始终考虑几乎所有并发不安全的事情。
标签: go concurrency synchronization thread-safety