[英]potential race condition in go language
我不確定以下代碼為何具有競爭條件,有人可以給我提示嗎? 我認為沒有潛在的比賽條件。 先感謝您。
type PossiblySafeCounter struct {
mu sync.Mutex
sum int
}
func (c *PossiblySafeCounter) inc() {
c.mu.Lock();
defer c.mu.Unlock();
go func() {
c.sum++
}()
}
func (c *PossiblySafeCounter) read() int {
c.mu.Lock();
defer c.mu.Unlock();
return c.sum
}
c.sum++
在goroutine中,該c.sum++
調度與inc()
方法的執行無關。 當inc()
方法退出時,互斥體的defer
解鎖將發生,並且很可能在錯誤的時間發生,從而導致競爭狀態。
正如@Flimzy建議使用atomic.AddInt32
完全不需要互斥量。
兩個基於互斥量的解決方案要么不在goroutine中遞增:
func (c *PossiblySafeCounter) inc() {
c.mu.Lock();
defer c.mu.Unlock();
c.sum++
}
或在 goroutine中進行鎖定和解鎖:
func (c *PossiblySafeCounter) inc() {
go func() {
c.mu.Lock();
defer c.mu.Unlock();
c.sum++
}()
}
但老實說,在此示例中進行任何類型的goroutine都沒有意義。 為什么您需要將增量添加到goroutine中?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.