Go語(yǔ)言的內(nèi)存模型是什么-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)Go語(yǔ)言的內(nèi)存模型是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)延安,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575

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 中在語(yǔ)言規(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 之前,那么我們說(shuō) e2 發(fā)生在 e1 之后。同樣,如果 e1 不在 e2 之前發(fā)生也不在 e2 之后發(fā)生,那么我們說(shuō) e1 和 e2 同時(shí)發(fā)生。

在一個(gè)單獨(dú)的 goroutine 中,happens-before 順序就是在程序中的順序。

一個(gè)對(duì)變量 v 的 讀操作 r 可以被允許觀察到一個(gè)對(duì) v 的寫操作 w,如果下列條件同時(shí)滿足:

r 不在 w 之前發(fā)生在 w 之后,r 之前,沒(méi)有其他對(duì) v 的寫入操作 w' 發(fā)生。

為了確保一個(gè)對(duì)變量 v 的讀操作 r 觀察到一個(gè)對(duì) v 的 寫操作 w,必須確保 w 是的 r 允許的寫操作。就是說(shuō)下列條件必須同時(shí)滿足:

w 在 r 之前發(fā)生任何其他對(duì)共享的變量 v 的寫操作發(fā)生在 w 之前或 r 之后。

這兩個(gè)條件比前面兩個(gè)條件要嚴(yán)格,它要求不能有另外的寫操作與 w 或 r 同時(shí)發(fā)生。

在一個(gè)單獨(dú)的 goroutine 中,沒(méi)有并發(fā)存在,所以這兩種定義是等價(jià)的:一個(gè)讀操作 r 觀察到的是最近對(duì) v 的寫入操作 w 。當(dāng)多個(gè) goroutine 訪問(wèn)一個(gè)共享的變量 v 時(shí),它們必須使用同步的事件來(lái)建立 happens-before 條件來(lái)確保讀操作觀察到預(yù)期的寫操作。

在內(nèi)存模型中,使用零值初始化一個(gè)變量的 v 的行為和寫操作的行為一樣。

讀取和寫入超過(guò)單個(gè)機(jī)器字【32 位或 64 位】大小的值的行為和多個(gè)無(wú)序地操作單個(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 語(yǔ)句的執(zhí)行在這個(gè) goroutine 開(kāi)始執(zhí)行前發(fā)生。

比如,在這個(gè)程序中:

var a string

func f() {
	print(a) // 后
}

func hello() {
	a = "hello, world"
	go f() // 先
}

名稱欄目:Go語(yǔ)言的內(nèi)存模型是什么-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://muchs.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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)