我有兩個結構體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
是一個很大的值,并且沒有便宜的方法可以保證您想要的全有或全無更新(而不執行一些同步本身)。
但是,是的,您應該使用互斥鎖來保護配置。如果存在太多爭用并且您暫時不介意舊配置,那么您可以定期輪詢官方配置并在其更改時更新本地副本。
實際上,互斥體速度很快,并且擁有異步正確的代碼幾乎總是更好,即使它有點慢。例如,如果您沒有異步正確的代碼,則即使您的代碼按照您想要的方式運行,您也無法輕松使用競爭檢測器來查找其他真正的問題。
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消