簡體   English   中英

Go語言中潛在的種族條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM