根據文檔,是否調用了安全的Wait()方法sync.Cond,它Unlock()首先執行?假設我們正在檢查要滿足的條件: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()執行了Unlock,那么 (A) 應該有自己的鎖定嗎?還是原子性?
1 回答
神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
是的,Wait即使在它L.Unlock()首先調用時調用也是安全的,但是在調用Wait之前和檢查條件之前獲取鎖是必不可少的,因為在這種情況下,兩者都不是線程安全的。
Wait原子地解鎖c.L并暫停調用 goroutine 的執行。稍后恢復執行后,返回前Wait鎖定c.L。
調用的 goroutine
Wait獲取了鎖,檢查了條件,發現不滿意。現在它等待,但為了允許條件的變化,它需要返回鎖定。
Wait自動為您執行此操作,然后掛起 goroutine。現在條件可能發生變化,最終 goroutine 被
Broadcastor喚醒Signal。然后它獲取鎖以再次檢查條件(這必須對每個等待的 goroutine 一一進行,否則將無法知道現在有多少 goroutine 自由運行)。
- 1 回答
- 0 關注
- 208 瀏覽
添加回答
舉報
0/150
提交
取消
