为了账号安全,请及时绑定邮箱和手机立即绑定

go中给结构体赋值是原子的吗?

go中给结构体赋值是原子的吗?

Go
交互式爱情 2023-08-21 14:49:15
我有两个结构体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互斥锁来保护对访问的访问?GetConfig编辑:Reader goroutine在 for 循环中调用。不需要“立即”查看配置的更新值。读者可以在下一次迭代中看到cfg的更新值。所以我重新表述我的问题:读者是否可以看到部分更新的配置值?
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

不,如果您异步修改配置,您不应期望看到全部或全部更新的配置。

Go 试图做到合理(即使它没有正式保证);如果您在字大小的更新无法撕裂的体系结构上更新字大小的对象,那么即使您不同步,您也将看到更新或看不到更新。(这与 C 和 C++ 不同,其中未定义的行为意味着编译器可以合法地执行任何操作)。但在这里,Config是一个很大的值,并且没有便宜的方法可以保证您想要的全有或全无更新(而不执行一些同步本身)。

但是,是的,您应该使用互斥锁来保护配置。如果存在太多争用并且您暂时不介意旧配置,那么您可以定期轮询官方配置并在其更改时更新本地副本。

实际上,互斥体速度很快,并且拥有异步正确的代码几乎总是更好,即使它有点慢。例如,如果您没有异步正确的代码,则即使您的代码按照您想要的方式运行,您也无法轻松使用竞争检测器来查找其他真正的问题。



查看完整回答
反对 回复 2023-08-21
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信