繁体   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