条件变量中的 RWMutex
RWMutex in conditional variable
为什么条件变量中的 RWMutex
没有 RLock
和 RUnLock
方法?
package main
import (
"sync"
)
func main() {
cond := &sync.Cond{L: &sync.RWMutex{}}
cond.L.RLock()
cond.L.RUnlock()
}
我收到一个错误:
cond.L.RLock undefined (type sync.Locker has no field or method RLock)
cond.L.RUnlock undefined (type sync.Locker has no field or method RUnlock)
A sync.Cond
仅使用 Cond
所需的 sync.Locker: Lock
and Unlock
. The minimal interface 所需的方法,因此只是这两种方法。
您仍然可以直接使用 RWMutex
(而不是通过 Cond
),并且 Cond
仍然有效。
func main() {
myMutex := &sync.RWMutex{}
cond := sync.NewCond(myMutex)
// Use the RW mutex directly.
myMutex.RLock()
myMutex.RUnlock()
// Use the mutex through cond. Lock and Unlock only.
cond.L.Lock()
cond.L.Unlock()
}
或者您可以在确保它是预期类型后通过Cond.L
使用它:
func main() {
cond := &sync.Cond{L: &sync.RWMutex{}}
// Typecheck cond.L.
myRWMutex, ok := cond.L.(*sync.RWMutex)
if !ok {
panic("AHHHH!!!")
}
myRWMutex.RLock()
myRWMutex.RUnlock()
}
(您可以跳过类型检查,只说 cond.L.(*sync.RWMutex)
,但如果它不是 sync.RWMutex
,您的程序将会崩溃)
为什么条件变量中的 RWMutex
没有 RLock
和 RUnLock
方法?
package main
import (
"sync"
)
func main() {
cond := &sync.Cond{L: &sync.RWMutex{}}
cond.L.RLock()
cond.L.RUnlock()
}
我收到一个错误:
cond.L.RLock undefined (type sync.Locker has no field or method RLock)
cond.L.RUnlock undefined (type sync.Locker has no field or method RUnlock)
A sync.Cond
仅使用 Cond
所需的 sync.Locker: Lock
and Unlock
. The minimal interface 所需的方法,因此只是这两种方法。
您仍然可以直接使用 RWMutex
(而不是通过 Cond
),并且 Cond
仍然有效。
func main() {
myMutex := &sync.RWMutex{}
cond := sync.NewCond(myMutex)
// Use the RW mutex directly.
myMutex.RLock()
myMutex.RUnlock()
// Use the mutex through cond. Lock and Unlock only.
cond.L.Lock()
cond.L.Unlock()
}
或者您可以在确保它是预期类型后通过Cond.L
使用它:
func main() {
cond := &sync.Cond{L: &sync.RWMutex{}}
// Typecheck cond.L.
myRWMutex, ok := cond.L.(*sync.RWMutex)
if !ok {
panic("AHHHH!!!")
}
myRWMutex.RLock()
myRWMutex.RUnlock()
}
(您可以跳过类型检查,只说 cond.L.(*sync.RWMutex)
,但如果它不是 sync.RWMutex
,您的程序将会崩溃)