根據(jù)文檔,是否調(diào)用了安全的Wait()方法sync.Cond,它Unlock()首先執(zhí)行?假設(shè)我們正在檢查要滿足的條件:func sample() { cond = &sync.Cond{L: &sync.Mutex{}} // accessible by other parts of program go func() { cond.L.Lock() for !condition() { cond.Wait() } // do stuff ... cond.L.Unlock() }() go func() { cond.L.Lock() mutation() cond.L.Unlock() cond.Signal() }()}和:func condition() bool { // assuming someSharedState is a more complex state than just a bool return someSharedState}func mutation() { // assuming someSharedState is a more complex state than just a bool // (A) state mutation on someSharedState}既然Wait()執(zhí)行了Unlock,那么 (A) 應(yīng)該有自己的鎖定嗎?還是原子性?
1 回答

神不在的星期二
TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
是的,Wait
即使在它L.Unlock()
首先調(diào)用時(shí)調(diào)用也是安全的,但是在調(diào)用Wait
之前和檢查條件之前獲取鎖是必不可少的,因?yàn)樵谶@種情況下,兩者都不是線程安全的。
Wait
原子地解鎖c.L
并暫停調(diào)用 goroutine 的執(zhí)行。稍后恢復(fù)執(zhí)行后,返回前Wait
鎖定c.L
。
調(diào)用的 goroutine
Wait
獲取了鎖,檢查了條件,發(fā)現(xiàn)不滿意。現(xiàn)在它等待,但為了允許條件的變化,它需要返回鎖定。
Wait
自動(dòng)為您執(zhí)行此操作,然后掛起 goroutine。現(xiàn)在條件可能發(fā)生變化,最終 goroutine 被
Broadcast
or喚醒Signal
。然后它獲取鎖以再次檢查條件(這必須對(duì)每個(gè)等待的 goroutine 一一進(jìn)行,否則將無法知道現(xiàn)在有多少 goroutine 自由運(yùn)行)。
- 1 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報(bào)
0/150
提交
取消