golang同步機制之通道

2021-09-24 15:39:54 字數 958 閱讀 6748

1.通道是什麼

通道,在golang中的形式為型別為chan,是golang中同步的兩個機制之一(另乙個是waitgroup)。

chan的語法形式如下:

channeltype = ( "chan" | "chan" "<-" | "<-" "chan" ) elementtype .

chan的型別可以是chan、chan<-、<-chan任意一種+資料型別(如int或者自定義型別)

2.通道的用法

1)建立chan

建立chan的方法如下:

c := make(chan int, 1)

make後面為緩衝數目,如果不加緩衝,則為無緩衝。

可以建立只有讀或者寫的chan,但這樣的通道沒有什麼用,故在實踐中不常存在。

2)讀寫chan

讀寫chan的符號為<-。讀chan形式為 <-ch, 寫chan形式為 ch<-。

緩衝數意味著讀取或寫入數目夠了的話,將無法進行讀取或寫入。

沒有緩衝的chan將會阻塞讀或者寫,直到有讀或者寫。

3)關閉chan

關閉chan的方法為close()。chan被關閉以後,並不馬上消除空間(因為golang語言的)

4)無緩衝的chan與有緩衝的chan

就像上面的所說的,如果不加緩衝數目,則為無緩衝的chan;否則會生成一定緩衝數目。

沒有緩衝的chan將會阻塞讀或者寫,直到有讀或者寫。

緩衝數目夠了以後,chan也將不會讀和寫。

5)chan與select

chan可以與select一起用,用於併發控制。

select和chan的用法如下:

1)select會遍歷所有case;

2)所有的case都會被求值或計算,求值或計算順序:從左到右,從上到下;

3)如果chan沒有阻塞,則隨機執行乙個case;

4)如果chan被阻塞,則直到乙個chan不被阻塞才會執行。

linux同步機制

一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 spinlock t spin 初始化自旋鎖 spin lock init lock 獲得自旋鎖 spin lock lock 獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放 spin ...

MySQL 同步機制

innodb沒有使用作業系統同步機制,而是自己封裝,通過spin 自旋 和wait array 等待佇列 的設計提高效能 目前的cpu都支援tas指令。該指令通過讀取乙個位元組或者乙個word,然後和0比較,並且無條件的將其在記憶體中的值設為1,是原子操作。用到swap atomic操作,將記憶體中...

執行緒同步機制

本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...