golang的goroutine 同步 鎖

2021-09-27 13:24:29 字數 2323 閱讀 2722

goroutine(協程)。

程序、執行緒?

程序,執行緒都是os層面的系統排程方式。

協程是使用者層面的呼叫方式,利用更少的資源進行切換,而不需要system call。

但協程是呼叫的os的執行緒在執行。

當乙個函式為def abc()時,使用go abc() 即為開乙個協程去呼叫這個函式

goroutine在遇到檔案i/o的時候,(執行緒和goroutine會與邏輯處理器)會分隔開,然後os新建立乙個執行緒,將其繫結這個邏輯處理器接著執行,當之前的系統呼叫執行完成的時候,那個goroutine會放到等到佇列,執行緒也會儲存好,等待下次使用。

網路i/o稍有不同。網路i/o中,goroutine會與邏輯處理器分離,一旦該輪詢器指示的某個網路讀/網路寫完成後,goroutine就會繫結對應的邏輯處理器來出來,處理完後又分離。

看起來執行緒池與協程有點像?,看下面的解釋。

(協程在對堆上分配堆疊~,跟常見的上下文切換,棧儲存資訊有挺大區別)

協程在上下文切換的時候,資訊儲存在goroutine中。

go的csp併發模型:

1、多執行緒共享記憶體。

2、通訊的方式共線資料。

goroutine在排程器排程的時候,也會出現防餓死而轉到另乙個goroutine的情況

package main

import (

"fmt"

"runtime"

"sync"

"time"

)func general_func()

func nice()

func main()

}}() //這裡加個括號是閉包函式的使用,意思為直接呼叫該函式。

go func()

}}() //這裡加個括號是閉包函式的使用,意思為直接呼叫該函式。

//sleep 2s

time.sleep(time.duration(2)*time.second) //如果不加這句話,也沒有wg.wait,有可能goroutine直接跑完而不顯示上面的字元了

fmt.println("it sound good")

}

同步goroutine的原子函式:

原子函式底層通過加鎖的訪問,還挺神奇。

package main

import (

"fmt"

"runtime"

"sync"

"sync/atomic"

)//define 多個變數

var (

counter int64

wg sync.waitgroup

)func inccounter(id int)

fmt.println(counter)

}func main()

類似的還有loadint64和storeint64,這兩個一起用來分別讀和寫,那麼不會進入競爭狀態,原子函式會保持同步

互斥鎖,跟其它語言一樣。

channel,用make建立,分為有緩衝和無緩衝。(buffer為了平衡讀寫差異,穩)

無緩衝channel需要讀寫均準備好,才會傳輸資料。(確保同時傳輸資料)

使用channel時,會處於阻塞狀態。

example:

/*

來自書本的乙個例子,兩個人玩球,分別從channel拿資料,當拿到channel被關閉時,其獲勝。

當其隨機數%x為0時,其失敗,並且close channel

*/package main

import (

"fmt"

"sync"

"math/rand"

)//define 多個變數

var (

counter int64

wg sync.waitgroup

)func play(name string,buffered chan int)

//生成乙個100內的隨機數

n := rand.intn(100)

if n%15==0

fmt.printf("player %s hit %d\n",name,ball) //打中的次數

ball++

buffered

}}func main()

對於有緩衝的buffer:

只有在目標buffer滿了,傳送端的channel才會阻塞;

只有在獲取的buffer滿了,讀動作的buffer才會阻塞;

golang開發 二 安裝 Golang

當然了我們的安裝都是在vagrant裡面安裝,vagrant ssh。不用虛擬機器了,本機安裝當然也可以。go is a tool for managing go source code.usage go command arguments the commands are build compil...

golang開發 二 安裝 Golang

當然了我們的安裝都是在vagrant裡面安裝,vagrant ssh。不用虛擬機器了,本機安裝當然也可以。go is a tool for managing go source code.usage go command arguments the commands are build compil...

golang多核的使用

實際上協程只是發生在單個程序內部的,要是想充分的發掘多核cpu的潛力,還是需要多程序的支援。對於多核程式設計,go是天生支援,那麼我們在什麼情況下應該用多核心來加速程式,而在什麼情況下用單核即可呢?現在我們用一簡單的程式來說明下 定義任務佇列 varwaitgroup sync waitgroup ...