gpt4 book ai didi

go - 条件变量中的 RWMutex

转载 作者:IT王子 更新时间:2023-10-29 02:02:24 28 4
gpt4 key购买 nike

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

最佳答案

sync.Cond 仅使用 sync.Locker 所需的方法: LockUnlock。最小的interface Cond 需要的就是这两个方法。

您仍然可以直接使用您的 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,你的程序会 panic )

关于go - 条件变量中的 RWMutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48127289/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com