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

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

在go中訪問struct的不同成員是否線程安全?

在go中訪問struct的不同成員是否線程安全?

Go
翻閱古今 2021-09-27 17:35:42
從不同的 goroutine 訪問不同的結構成員是否安全?我知道在沒有同步的情況下寫入同一個變量是危險的:package maintype Apple struct {    color string    size  uint}func main() {    apple := &Apple{}    go func() {        apple.color = "red"    }()    go func() {        apple.color = "green"    }()}但是你可以在沒有任何同步的情況下寫入不同的結構成員嗎?package maintype Apple struct {    color string    size  uint}func main() {    apple := &Apple{}    go func() {        apple.color = "red"    }()    go func() {        apple.size = 42    }()}或者我應該使用chan或sync.Mutex為此?
查看完整描述

1 回答

?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

從不同的線程訪問不同的變量應該是安全的,結構成員是不同的變量。所以是的,它應該是安全的。

但是,它可能不會很快。像結構成員一樣在內存中靠得很近的變量將共享一個 CPU 緩存行。緩存線是 CPU(以及大多數當前型號)可以鎖定的最小內存塊。這意味著 CPU-2 必須等到 CPU-1 完成該緩存行后再寫入,即使它們正在寫入不同的變量。

從不同線程寫入結構時更改指向結構的指針是不安全的。在您的示例中,如果您有第三個 goroutineapple = &Apple{}執行其他線程中的其他一些 goroutine,則可能會寫入舊 Apple 或新 Apple,而您不會知道。


查看完整回答
1 反對 回復 2021-09-27
  • 1 回答
  • 0 關注
  • 377 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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