Go 等待互斥体而不获取它

Go 等待互斥体而不获取它,go,concurrency,mutex,Go,Concurrency,Mutex,我一直在编写一个小型微服务,以便熟悉Go及其并发机制 在我的程序中,我有一个具有状态的结构,我想同步该状态,以便多个goroutine能够读取它,但不能在另一个goroutine更新该状态时读取 起初我认为RWMutax是我所需要的,但根据文档,在任何给定的移动中,只有一个goroutine可以获得读取锁。我是这样说的: 如果一个goroutine拥有一个用于读取的RWMutex和另一个goroutine 可能会调用Lock,任何goroutine都不应该期望能够获得 读取锁定,直到释放初始读取

我一直在编写一个小型微服务,以便熟悉Go及其并发机制

在我的程序中,我有一个具有状态的结构,我想同步该状态,以便多个goroutine能够读取它,但不能在另一个goroutine更新该状态时读取


起初我认为RWMutax是我所需要的,但根据文档,在任何给定的移动中,只有一个goroutine可以获得读取锁。我是这样说的:

如果一个goroutine拥有一个用于读取的RWMutex和另一个goroutine 可能会调用Lock,任何goroutine都不应该期望能够获得 读取锁定,直到释放初始读取锁定

有没有办法在不获取锁的情况下等待互斥锁

大致如下:

类型有状态结构{ 状态int stateMutex sync.Mutex 被更新的布尔 } 类型有状态接口{ GetState int SetStatest int } func createStateful sa字符串有状态{ 返回服务器{state:0,stateMutex:sync.Mutex{},beingUpdated:false} } func s*有状态SetStatest int{ s、 状态互斥锁 s、 beingUpdated=真 s、 州=st s、 beingUpdated=false s、 stateMutex.Unlock } func s*有状态GetState bool{ 如果s.被更新{ //等待s.stateMutex被解锁 } 返回美国 } 您可能误读了以下内容:

。。。锁可以由任意数量的读卡器或单个读卡器持有 作家

因此,您的代码简化如下:

type stateful struct {
    l     sync.RWMutex // style: place lock above ...
    state int        //        ... the field it protects
}

func (s *stateful) SetState(st int) {
    s.l.Lock()
    defer s.l.Unlock()

    s.state = st
}

func (s *stateful) GetState() int {
    s.l.RLock()
    defer s.l.RUnlock()

    return s.state
}

在任何给定的移动中,只有一个goroutine可以获得读锁,为什么您认为RWMutex是这样工作的?如果这是真的,那么RW互斥锁的整个概念将是无效的。从documantaion:如果一个goroutine持有一个RW互斥锁用于读取,而另一个goroutine可能会调用Lock,那么在初始读取锁被释放之前,任何goroutine都不应该期望能够获得读取锁。我把这句话带给meen this,上面写着另一个goroutine可能会叫Lock而不是Rlock。当然,在没有任何其他读取器的情况下,只能提供一个用于写入的锁。