1 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個贊
在任何函數(shù)開始執(zhí)行之前,變量a
和b
使用它們各自類型的零值(0
在 的情況下int
)進(jìn)行分配和初始化,在這一行:
var a, b int
可能會改變的是在f()
函數(shù)中為它們分配新值的順序。
引用該頁面:之前發(fā)生:
在單個 goroutine 中,讀取和寫入必須按照程序指定的順序執(zhí)行。也就是說,只有當(dāng)重新排序不會改變語言規(guī)范定義的 goroutine 中的行為時,編譯器和處理器才可以重新排序在單個 goroutine 中執(zhí)行的讀取和寫入。由于這種重新排序,一個 goroutine 觀察到的執(zhí)行順序可能與另一個 goroutine 感知的順序不同。例如,如果一個 goroutine 執(zhí)行
a = 1; b = 2;
,另一個可能會在 的更新值b
之前觀察 的更新值a
。
如果重新排序它們不會在同一個 goroutine 中產(chǎn)生影響a
,b
則分配給和可能不會按照您編寫它們的順序發(fā)生。例如,如果首先更改 的值b
更有效(例如,因?yàn)槠涞刂芬鸭虞d到寄存器中),則編譯器可能會對它們重新排序。如果更改賦值順序會(或可能)在同一個 goroutine 中導(dǎo)致問題,那么顯然編譯器不允許更改順序。由于f()
函數(shù)的 goroutine 對變量不做任何處理,a
并且b
在賦值之后,編譯器可以自由地以任何順序執(zhí)行賦值。
由于上述示例中的 2 個 goroutine 之間沒有同步,因此編譯器不會檢查重新排序是否會導(dǎo)致其他 goroutine 出現(xiàn)任何問題。它沒有必要。
Buf 如果你同步你的 goroutines,編譯器會確保在“同步點(diǎn)”沒有不一致:你將保證在那個點(diǎn)兩個分配都將“完成”;因此,如果“同步點(diǎn)”在print()
調(diào)用之前,那么您將看到分配的新值打?。?code>2和1
。
- 1 回答
- 0 關(guān)注
- 216 瀏覽
添加回答
舉報(bào)