为什么条件变量中的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)
答案 0 :(得分:2)
sync.Cond
仅使用sync.Locker所需的方法:Lock
和Unlock
。因此,Cond
所需的最小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
,您的程序就会惊慌失措)