条件变量中的 RWMutex

RWMutex in conditional variable

为什么条件变量中的 RWMutex 没有 RLockRUnLock 方法?

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)

https://play.golang.org/p/LdGYlrQQx86

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,您的程序将会崩溃)