gpt4 book ai didi

go - 如何在 Golang 中使用 RWMutex?

转载 作者:IT老高 更新时间:2023-10-28 12:59:04 34 4
gpt4 key购买 nike

type Stat struct {
counters map[string]*int64
countersLock sync.RWMutex
averages map[string]*int64
averagesLock sync.RWMutex
}

它在下面被称为
func (s *Stat) Count(name string) {
s.countersLock.RLock()
counter := s.counters[name]
s.countersLock.RUnlock()
if counter != nil {
atomic.AddInt64(counter, int64(1))
return
}
}

我的理解是,我们首先锁定接收者 s(这是一个 Stat 类型),然后如果计数器确实存在,我们就添加它。

问题:

Q1:为什么需要加锁?什么 RWMutex甚至是什么意思?

Q2: s.countersLock.RLock() - 这会锁定整个接收者还是仅锁定 Stat 类型的 counters 字段?

Q3: s.countersLock.RLock() - 这会锁定平均值字段吗?

Q4:为什么要使用 RWMutex ?我认为 channel 是在 Golang 中处理并发的首选方式?

Q5:这是什么 atomic.AddInt64 .为什么在这种情况下我们需要原子?

Q6:为什么我们要在添加之前解锁?

最佳答案

Questions:

Q1: why do we need to lock it? What does RWMutex even mean?



RW 代表读/写。 CF 文档: http://golang.org/pkg/sync/#RWMutex .

我们需要锁定它以防止其他例程/线程在我们处理它时更改该值。

Q2: s.countersLock.RLock() - does this lock up the entire receiver s or only the counters field in type Stat?



作为互斥锁,只有在调用 RLock() 时才会发生锁定。功能。如果任何其他 goroutine 已经调用了 WLock() ,然后它阻塞。您可以拨打任意号码 RLock()在同一个 goroutine 中,它不会锁定。

所以它不锁定任何其他字段,甚至不锁定 s.counters .在您的示例中,您锁定 map 查找以找到正确的计数器。

Q3: s.countersLock.RLock() - does this lock up the averages field?



不,如 Q2 所述, RLock只锁定自己。

Q4: Why should we use RWMutex? I thought channel was the preferred way to handle concurrency in Golang?



Channel 非常有用,但有时它是不够的,有时它没有意义。

在这里,当您锁定 map 访问时,互斥锁是有意义的。使用 chan,您必须有一个缓冲的 chan 为 1,在之前发送并在之后接收。不是很直观。

Q5: What is this atomic.AddInt64. Why do we need atomic in this case?



此函数将以原子方式递增给定变量。在你的情况下,你有一个竞争条件: counter是一个指针,实际变量可以在释放锁之后和调用 atomic.AddInt64 之前销毁。 .
如果您不熟悉此类事情,我建议您坚持使用互斥锁并在锁定/解锁之间进行所有您需要的处理。

Q6: Why would we unlock right before we add to it?



你不应该。

我不知道您要做什么,但这是一个(简单的)示例: https://play.golang.org/p/cVFPB-05dw

关于go - 如何在 Golang 中使用 RWMutex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19148809/

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