go條件變數的使用和原理

2022-07-28 00:21:15 字數 808 閱讀 3112

最近寫**時碰到乙個場景, 需要使用 map[int]struct{} 結構來儲存task, map的key是task的id,隨時可以增減。因為的確除了看書,基本上沒使用過條件變數所以後面過了一天才想到可以用條件變數來實現。記得在某篇部落格上看到的一句話挺不錯,大概是同步語句中,條件變數的特點在於等待。

一開始**大概是這樣的

func loop() 

lenght := len(task)

mutex.unlock()

// 為了減少cpu空轉 當隊列為空的時候sleep 2秒

if length == 2

}}

func addtask(t *task)
func loop() 

for taskid, task := range tasks

mutex.unlock()

}}

func addtask(t *task) 

mutex.unlock()

}

如果是c語言的pthread_cond條件變數和go最主要的區別,本質上還是協程和真正的核心執行緒的區別, go 自帶sync包裡的條件變數 對goruntine的操作,其阻塞/喚醒不需要陷入核心態。

func (c *cond) wait()
func (c *cond) signal() 

func (c *cond) broadcast()

go 條件變數

條件變數 共享資料的狀態發生變化時,通知阻塞在某個條件上的協程 執行緒 條件變數是乙個結構體,cond.l要搭配鎖一起使用 type cond struct 三個常用方法 func c cond wait a 阻塞等待條件變數滿足 b 釋放已掌握的互斥鎖相當於cond.l.unlock 注意 兩步為...

條件變數基本概念和原理

條件變數的作用是用於多執行緒之間關於共享資料狀態變化的通訊。當乙個動作需要另外乙個動作完成時才能進行,即 當乙個執行緒的行為依賴於另外乙個執行緒對共享資料狀態的改變時,這時候就可以使用條件變數 假設沒有條件變數,對於乙個生產者消費者問題,消費執行緒在得知佇列中沒有產品時,將阻塞自己。生產線程給佇列中...

條件變數基本概念和原理

條件變數的作用是用於多執行緒之間關於共享資料狀態變化的通訊。當乙個動作需要另外乙個動作完成時才能進行,即 當乙個執行緒的行為依賴於另外乙個執行緒對共享資料狀態的改變時,這時候就可以使用條件變數 假設沒有條件變數,對於乙個生產者消費者問題,消費執行緒在得知佇列中沒有產品時,將阻塞自己。生產線程給佇列中...