- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我不确定何时使用 RWMutex 以及何时使用 Mutex。
如果你使用 RWMutex 而不是 Mutex,如果你做更多的读然后写,你会节省资源吗?
我看到有些人无论做什么都一直使用 Mutex,有些人使用 RWMutex 并运行这些方法:
func (rw *RWMutex) Lock()
func (rw *RWMutex) Unlock()
func (rw *RWMutex) RLock()
func (rw *RWMutex) RUnlock()
而不仅仅是:
func (m *Mutex) Lock()
func (m *Mutex) Unlock()
如果你节省资源,如果你做更多的读然后写,你应该使用 RWMutex 有那么大的区别吗?
最佳答案
来自 the docs (强调我的):
A RWMutex is a reader/writer mutual exclusion lock. The lock can be held by an arbitrary number of readers or a single writer. The zero value for a RWMutex is an unlocked mutex.
换句话说,读者不必互相等待。他们只需要等待持有锁的写入者。
因此,对于大部分读取的数据而言,sync.RWMutex 更可取,与 sync.Mutex 相比,节省的资源是时间。
关于go - 使用 RWMutex 代替 Mutex 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48861029/
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 我对该文件做
我是一名优秀的程序员,十分优秀!