gpt4 book ai didi

go - Go 语言中的潜在竞争条件

转载 作者:IT王子 更新时间:2023-10-29 02:26:24 26 4
gpt4 key购买 nike

我不确定为什么下面的代码有竞争条件,有人可以给我提示吗?我认为没有潜在的竞争条件。先感谢您。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com