08 同步3 條件變數

2021-10-10 20:56:28 字數 1533 閱讀 8242

sync.cond型別即是go中的條件變數,該型別內部包含乙個鎖介面。條件變數通常與鎖配合使用:

建立條件變數的函式:

func

newcond

(l locker)

*cond // 條件變數必須傳入乙個鎖,二者需要配合使用

*sync.cond型別有三個方法:

示例:

func

main()

) condition :=

false

// 開啟乙個新的協程,修改變數 condition

gofunc()

()// main協程 是被通知的物件,等待通知

cond.l.

lock()

for!condition

cond.l.

unlock()

// 接到通知後,會被再次鎖住,所以需要在需要的場合釋放

fmt.

println

("執行結束"

)}

使用條件變數優化生產消費模型(支援多個生產者、多個消費者):

package main

import

("fmt"

"math/rand"

"sync"

"time"

)// 定義緩衝區大小

const buflen =

5// 全域性位置定義全域性變數

var cond *sync.cond = sync.

newcond

(&sync.mutex

)// 生產者

func

producer

(ch chan

<-

int)

ch <- rand.

intn

(1000

)// 寫入緩衝區乙個隨機數

cond.l.

unlock()

// 生產結束,解鎖互斥鎖

cond.

signal()

// 一旦生產後,就喚醒其他被阻塞的消費者

time.

sleep

(time.second *2)

}}// 消費者

func

consumer

(ch <-

chan

int)

fmt.

println

("receive:"

,<-ch)

cond.l.

unlock()

cond.

signal()

time.

sleep

(time.second *1)

}}func

main()

// 啟動10個消費者

for i :=

0; i <

10; i++

// 阻塞主程式退出

for}

Linux 執行緒同步3 條件變數

條件變數是執行緒同步的另一種同步機制。執行緒在改變條件狀態前必須首先鎖住互斥量,其他執行緒在獲得互斥量之前不會察覺到這種改變,因為必須鎖定互斥量以後才能計算條件。條件變數使用之前必須首先進行初始化,pthread cond t資料型別代表的條件變數可以用兩種方式進行初始化。對於靜態分配的條件變數可以...

執行緒同步(2)條件變數

互斥鎖有乙個明顯的缺點就是只有兩種狀態 鎖定和非鎖定,而條件變數通過允許執行緒阻塞和等待另個執行緒傳送訊號的方法來彌補互斥鎖的不足。條件變數通常和互斥鎖一起使用。條件變數的結構為pthread cond t 涉及函式 pthread cond init pthread cond detroy pth...

Linux執行緒同步 4 條件變數

分類 應用程式設計 2007 08 22 19 39 3812人閱讀收藏 舉報條件變數分為兩部分 條件和變數.條件本身是由互斥量保護的.執行緒在改變條件狀態前先要鎖住互斥量.1.初始化 條件變數採用的資料型別是pthread cond t,在使用之前必須要進行初始化,這包括兩種方式 pthread....