为什么在这个golang例子中,互斥部分中的条件不会死锁?

33qvvth1  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(114)

我在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获取互斥量时代码会死锁。

s4n0splo

s4n0splo1#

我没有注意到condition与mutex有联系:newPurchase = sync.NewCond(&mutex) Entering .Wait()解锁了mutex,并在收到condition Signal后尝试重新获取它。
condition.Wait()只能在获取互斥体的情况下使用,因此它的工作代价是代码不像它可能的那样可读:-)

相关问题