從不同的 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 回答
- 0 關注
- 377 瀏覽
添加回答
舉報
0/150
提交
取消