亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號