作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我不确定为什么下面的代码有竞争条件,有人可以给我提示吗?我认为没有潜在的竞争条件。先感谢您。
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++
位于一个独立于 inc()
方法执行的 goroutine 中。当 inc()
方法退出时,互斥锁的延迟
解锁将会发生并且很可能发生在错误的时间,从而导致竞争条件。
正如@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 中?
关于go - Go 语言中的潜在竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43420958/
我是一名优秀的程序员,十分优秀!