簡體   English   中英

在 go 中為結構原子賦值嗎?

[英]Is assigning value to a struct atomic in go?

我有兩個結構AppConfig

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訪問?

編輯:閱讀器 goroutines 在 for 循環中調用GetConfig 不需要“立即”查看配置的更新值。 讀者可以在下一次迭代中看到cfg的更新值。

所以我重新表述我的問題:讀者是否有可能看到部分更新的配置值?

不,如果您異步修改它,您不應該期望看到全部或全部更新的配置。

Go 試圖做到合理(即使它沒有正式保證); 如果你在一個字大小的更新不能撕裂的架構上更新一個字大小的對象,那么即使你不同步,你也會看到更新。 (這與 C 和 C++ 不同,在 C 和 C++ 中,未定義的行為意味着編譯器可以合法地做任何事情)。 但是在這里, Config是一個很大的值,並且沒有便宜的方法可以保證您想要的全有或全無更新(不執行某些同步本身)。

但是,是的,您應該使用互斥鎖來保護配置。 如果有太多的爭用並且您一點也不介意舊配置,那么您可以定期輪詢官方配置並在更改時更新本地副本。

從實用角度講,互斥體很快,即使速度慢一點,也有異步正確的代碼幾乎總是更好。 例如,如果您沒有異步正確的代碼,即使您的代碼按照您的意願運行,您也無法輕松地使用競爭檢測器來查找其他真正的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM