第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

golang中不正確的同步

golang中不正確的同步

Go
蝴蝶刀刀 2021-11-15 20:45:14
當(dāng)我查看 golang 內(nèi)存模型文檔(鏈接)時,我在 go lang 上發(fā)現(xiàn)了一個奇怪的行為。該文檔說下面的代碼可能會發(fā)生 g 打印 2 然后打印 0。var a, b intfunc f() {    a = 1    b = 2}func g() {    print(b)    print(a)}func main() {    go f()    g()}這只是常規(guī)問題嗎?因?yàn)槲液芎闷鏋槭裁醋兞?'b' 的值分配可以在 'a' 之前發(fā)生?即使 'a' 和 'b 的賦值發(fā)生在不同的線程中(不在主線程中),是否必須確保在它自己的線程中在 'b' 之前分配 'a'?(因?yàn)?' a' 先出現(xiàn),然后 'b' 出現(xiàn))有人能清楚地告訴我這個問題嗎?
查看完整描述

1 回答

?
夢里花落0921

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個贊

在任何函數(shù)開始執(zhí)行之前,變量ab使用它們各自類型的零值(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。


查看完整回答
反對 回復(fù) 2021-11-15
  • 1 回答
  • 0 關(guān)注
  • 216 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號