【问题标题】:RWMutex in conditional variable条件变量中的 RWMutex
【发布时间】:2018-01-06 12:22:49
【问题描述】:

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

【问题讨论】:

    标签: go mutex


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 2010-12-31
      • 1970-01-01
      • 2011-06-16
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多