我在O'Reilly的一次培训中遇到了这个例子。有一个条件应该防止widgetInventory变为负数。这个例子可以工作,但是我不明白为什么当makeSales获取互斥量并且widgetInventory为0时程序不会死锁。
var (
wg sync.WaitGroup
mutex = sync.Mutex{}
widgetInventory int32= 1000
newPurchase = sync.NewCond(&mutex)
)
func main() {
fmt.Println("Starting inventory count = ", widgetInventory)
wg.Add(2)
go makeSales()
go newPurchases()
wg.Wait()
fmt.Println("Ending inventory count = ", widgetInventory)
}
func makeSales() {
for i := 0; i < 3000; i++ {
mutex.Lock()
if widgetInventory-100 < 0{
newPurchase.Wait()
}
widgetInventory -= 100
fmt.Println(widgetInventory)
mutex.Unlock()
}
wg.Done()
}
func newPurchases() {
for i := 0; i < 3000; i++ {
mutex.Lock()
widgetInventory+= 100
fmt.Println(widgetInventory)
newPurchase.Signal()
mutex.Unlock()
}
wg.Done()
}
字符串
我希望在widgetInventory为0时makeSales获取互斥量时代码会死锁。
1条答案
按热度按时间s4n0splo1#
我没有注意到condition与mutex有联系:
newPurchase = sync.NewCond(&mutex)
Entering .Wait()解锁了mutex,并在收到condition Signal后尝试重新获取它。condition.Wait()只能在获取互斥体的情况下使用,因此它的工作代价是代码不像它可能的那样可读:-)