- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
来自 Go 文档:
A RWMutex is a reader/writer mutual exclusion lock. The lock can be held by an arbitrary number of readers or a single writer.
这个介绍性句子后面从来没有定义读者和作者可以做什么和不可以做什么。因此,我想知道某个定义的延伸是否可行。
假设我们有一组许多协程;我们称它为 S
。 S
中的每个 goroutine 都有自己的资源,它经常读取和写入这些资源。假设我有一个额外的 goroutine R
,它经常想要抓取 S
中的 goroutines 写入的资源的状态。让我们探索两个更明显的解决方案,看看我要去哪里。
S
中的 goroutine 将不必要地竞争锁,因为来自 S
的每个 goroutine 无论如何都只能访问自己的资源。S
中的每个 goroutine 使用一个互斥量。这消除了不必要的竞争,甚至让 R
可以选择是否需要立即锁定所有互斥锁,或者在某个时间点至少锁定每个互斥锁一次。但是需要一些额外的工作。所以我的第三个想法是:让 S
中的 goroutines 在他们想要读取或写入时获取 sync.RWMutex
的读取锁(即通用 < em>inclusive lock) 并让 R
在需要读取时获取该互斥锁的写锁(即通用的 exclusive lock)。换句话说:
如果写入在设计上从不相互竞争,那么使用 sync.RWMutex
的读取锁进行写入并使用其写入锁进行读取是否安全?
最佳答案
你的问题的答案是肯定的,正如 Volker 所说。
我会给你一个更地道的 Go 解决方案:
every resources of goroutines in S take a sync.RWMutex
the goroutines in S read after sync.RWMutex.Rlock()
the goroutines in S write after sync.RWMutex.Lock()
extra goroutine R read after sync.RWMutex.Rlock()
我觉得你只是进错了区域,应该是个简单的问题。 :)
如果我误解了你,请告诉我。
关于go - 如果写入从不在设计上相互竞争,那么使用 sync.RWMutex 的读取锁进行写入并使用其写入锁进行读取是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57474513/
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 我对该文件做
我是一名优秀的程序员,十分优秀!