今天就跟大家聊聊有關(guān)Go語言的內(nèi)存模型是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
Go 內(nèi)存模型規(guī)定了一些條件,在這些條件下,在一個(gè) goroutine 中讀取變量返回的值能夠確保是另一個(gè) goroutine 中對(duì)該變量寫入的值。
Happens Before(在…之前發(fā)生)
在一個(gè) goroutine 中,讀操作和寫操作必須表現(xiàn)地就好像它們是按照程序中指定的順序執(zhí)行的。這是因?yàn)?,在一個(gè) goroutine 中編譯器和處理器可能重新安排讀和寫操作的執(zhí)行順序(只要這種亂序執(zhí)行不改變這個(gè) goroutine 中在語言規(guī)范中定義的行為)。
因?yàn)閬y序執(zhí)行的存在,一個(gè) goroutine 觀察到的執(zhí)行順序可能與另一個(gè) goroutine 觀察到的執(zhí)行順序不同。 比如,如果一個(gè) goroutine 執(zhí)行a = 1; b = 2;
,另一個(gè) goroutine 可能觀察到 b 的值在 a 之前更新。
為了規(guī)定讀取和寫入的必要條件,我們定義了happens before (在…之前發(fā)生),一個(gè)在 Go 程序中執(zhí)行內(nèi)存操作的部分順序。如果事件 e1 發(fā)生在事件 e2 之前,那么我們說 e2 發(fā)生在 e1 之后。同樣,如果 e1 不在 e2 之前發(fā)生也不在 e2 之后發(fā)生,那么我們說 e1 和 e2 同時(shí)發(fā)生。
在一個(gè)單獨(dú)的 goroutine 中,happens-before 順序就是在程序中的順序。
一個(gè)對(duì)變量 v 的 讀操作 r 可以被允許觀察到一個(gè)對(duì) v 的寫操作 w,如果下列條件同時(shí)滿足:
r 不在 w 之前發(fā)生在 w 之后,r 之前,沒有其他對(duì) v 的寫入操作 w' 發(fā)生。
為了確保一個(gè)對(duì)變量 v 的讀操作 r 觀察到一個(gè)對(duì) v 的 寫操作 w,必須確保 w 是的 r 允許的寫操作。就是說下列條件必須同時(shí)滿足:
w 在 r 之前發(fā)生任何其他對(duì)共享的變量 v 的寫操作發(fā)生在 w 之前或 r 之后。
這兩個(gè)條件比前面兩個(gè)條件要嚴(yán)格,它要求不能有另外的寫操作與 w 或 r 同時(shí)發(fā)生。
在一個(gè)單獨(dú)的 goroutine 中,沒有并發(fā)存在,所以這兩種定義是等價(jià)的:一個(gè)讀操作 r 觀察到的是最近對(duì) v 的寫入操作 w 。當(dāng)多個(gè) goroutine 訪問一個(gè)共享的變量 v 時(shí),它們必須使用同步的事件來建立 happens-before 條件來確保讀操作觀察到預(yù)期的寫操作。
在內(nèi)存模型中,使用零值初始化一個(gè)變量的 v 的行為和寫操作的行為一樣。
讀取和寫入超過單個(gè)機(jī)器字【32 位或 64 位】大小的值的行為和多個(gè)無序地操作單個(gè)機(jī)器字的行為一樣。
同步
初始化
程序初始化操作在一個(gè)單獨(dú)的 goroutine 中運(yùn)行,但是這個(gè) goroutine 可能創(chuàng)建其他并發(fā)執(zhí)行的 goroutines。
如果包 p 導(dǎo)入了包 q,那么 q 的 init 函數(shù)執(zhí)行完成發(fā)生在 p 的任何 init 函數(shù)執(zhí)行之前。
函數(shù) main.main【也就是 main 函數(shù)】 的執(zhí)行發(fā)生在所有的 init 函數(shù)完成之后。
Goroutine 創(chuàng)建
啟動(dòng)一個(gè)新的 goroutine 的 go 語句的執(zhí)行在這個(gè) goroutine 開始執(zhí)行前發(fā)生。
比如,在這個(gè)程序中:
var a string func f() { print(a) // 后 } func hello() { a = "hello, world" go f() // 先 }
名稱欄目:Go語言的內(nèi)存模型是什么-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://www.rwnh.cn/article46/pdphg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、品牌網(wǎng)站制作、響應(yīng)式網(wǎng)站、云服務(wù)器、手機(jī)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容