RWMutex在条件变量中

时间:2018-01-06 12:22:49

标签: go mutex

为什么条件变量中的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

1 个答案:

答案 0 :(得分:2)

sync.Cond仅使用sync.Locker所需的方法:LockUnlock。因此,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,您的程序就会惊慌失措)