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