- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
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
}
}
RWMutex
甚至是什么意思?
s.countersLock.RLock()
- 这会锁定整个接收者还是仅锁定 Stat 类型的 counters 字段?
s.countersLock.RLock()
- 这会锁定平均值字段吗?
RWMutex
?我认为 channel 是在 Golang 中处理并发的首选方式?
atomic.AddInt64
.为什么在这种情况下我们需要原子?
最佳答案
Questions:
Q1: why do we need to lock it? What does
RWMutex
even mean?
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?
RLock
只锁定自己。
Q4: Why should we use
RWMutex
? I thought channel was the preferred way to handle concurrency in Golang?
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?
关于go - 如何在 Golang 中使用 RWMutex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19148809/
var mu sync.RWMutex go func() { mu.RLock() defer mu.RUnlock() mu.RLock() // In my real
为什么条件变量中的RWMutex没有RLock和RUnLock方法? package main import ( "sync" ) func main() { cond := &syn
我有一个看似无害的包,它只是制作一个 slice 并使用 RWMutex 保护它。但是,当我运行它时,它仍然提示竞争条件。我究竟做错了什么? ( playground ) type Ids struc
我使用 sync.RWMutex 编写了以下示例程序。 package main import ( "fmt" "sync" "time" ) // SessionData :
我开始在带有 map 的 Go 项目中使用 RWMutex,因为现在我有多个例程同时运行并进行所有更改为此,我想到了一个疑问。 问题是我知道我们必须在仅读取时使用 RLock 以允许其他例程执行相同的
type Stat struct { counters map[string]*int64 countersLock sync.RWMutex averages
来自 Go 文档: A RWMutex is a reader/writer mutual exclusion lock. The lock can be held by an arbitrary n
以下代码因以下错误而崩溃,为什么?? package main import ( "sync" ) var foo *sync.RWMutex func main() { foo.Lo
我正在寻找源代码的 gorilla 上下文。我不明白它究竟是做什么的 sync,mutex.Lock, mutex.Unlock。当我从源代码中删除 mutex.Lock 和 Mutex.Unlock
在src/sync/rwmutex.go文件中,我们可以看到“Lock”的定义如下: func (rw *RWMutex) Lock() { if race.Enabled {
我不确定何时使用 RWMutex 以及何时使用 Mutex。 如果你使用 RWMutex 而不是 Mutex,如果你做更多的读然后写,你会节省资源吗? 我看到有些人无论做什么都一直使用 Mutex,有
var mu sync.RWMutex //goroutine 1 go func() { mu.Lock() defer mu.Unlock() //something els
在聊天示例中有一个名为 hub.go 的文件。 https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go 我对该文件做
我是一名优秀的程序员,十分优秀!