這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
cond的主要作用就是擷取鎖之後,wait()方法會等待一個通知,來進行下一步鎖釋放等操作,以此控制鎖合適釋放,釋放頻率,適用於在並發環境下goroutine的等待和通知。
針對Golang 1.9的sync.Cond,與Golang 1.10一樣。 原始碼位置:sync\cond.go。
結構體
type Cond struct { noCopy noCopy // noCopy可以嵌入到結構中,在第一次使用後不可複製,使用go vet作為檢測使用 // 根據需求初始化不同的鎖,如*Mutex 和 *RWMutex L Locker notify notifyList // 通知清單,調用Wait()方法的goroutine會被放入list中,每次喚醒,從這裡取出 checker copyChecker // 複製檢查,檢查cond執行個體是否被複製 }
再來看看等待隊列notifyList結構體:
type notifyList struct { wait uint32 notify uint32 lock uintptr head unsafe.Pointertail unsafe.Pointer}
函數
NewCond
相當於Cond的建構函式,用於初始化Cond。
參數為Locker執行個體初始化,傳參數的時候必須是引用或指標,比如&sync.Mutex{}或new(sync.Mutex),不然會報異常:cannot use lock (type sync.Mutex) as type sync.Locker in argument to sync.NewCond。
大家可以想想為什麼一定要是指標呢? 知道的可以給我留言回答。
func NewCond(l Locker) *Cond { return &Cond{L: l}}
Wait
等待自動解鎖c.L和暫停執行調用goroutine。恢複執行後,等待鎖c.L返回之前。與其他系統不同,等待不能返回,除非通過廣播或訊號喚醒。
因為c。當等待第一次恢複時,L並沒有被鎖定,調用者通常不能假定等待返回時的條件是正確的。相反,調用者應該在迴圈中等待:
為了容易理解,本文用一個簡化的銷售模型來闡述,如。圖1顯示了客戶、賣家、商品、定價、訂單的關係(這裡省略支付、物流等其他元素)。