【发布时间】:2020-07-04 08:08:56
【问题描述】:
我有两个结构 App 和 Config。
type App struct {
cfg Config
}
type Config struct {
dbHost string
dbPort int
user string
password string
}
以及在 App 上定义的两个方法来更新和读取cfg 字段。
func (app *App) UpdateConfig(newCfg Config) {
app.cfg = newCfg
}
func (app *App) GetConfig() Config {
return app.cfg
}
如果只有一个 goroutine 正在调用 UpdateConfig 并且多个 goroutine 正在通过 GetConfig 方法读取配置,我应该使用互斥锁保护对 app.cfg 的访问吗?
编辑:阅读器 goroutine 在 for 循环中调用 GetConfig。不需要“立即”查看配置的更新值。读者下次迭代看到cfg的更新值就OK了。
所以我重新表述我的问题:读者是否可以看到部分更新的配置值?
【问题讨论】:
-
除非你使用
sync/atomic,否则没有什么是“原子的”,并发读取和写入始终是竞争条件。 -
如果您不使用同步/原子或互斥锁,则无法保证读取器 goroutine 何时会在写入发生后看到更改。
-
至少一个访问是写入的任何并发访问都是竞争条件并且行为未定义。同步访问,例如使用互斥锁。
-
感谢cmets,我已经编辑了问题。
-
即使你不需要看到更新的变量,它仍然是一场竞赛。没有安全的数据竞赛。使用
sync/atomic进行读/写。它的工作开销很小——内存屏障,不涉及锁定。读者不会看到部分更新的值。问题是,它可能永远看不到更新后的值。
标签: go