登录
首页 >  Golang >  Go问答

耐心等待互斥体的到来

来源:stackoverflow

时间:2024-02-15 15:18:25 241浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《耐心等待互斥体的到来》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我一直在编写一个小型微服务,因此请熟悉 go 及其并发机制。

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

一开始我以为 rwmutax 就是我所需要的,但是根据文档,只有一个 goroutine 可以在任何给定时刻获取读锁。我要沿着这条线走:

“如果一个 goroutine 持有一个用于读取的 rwmutex 和另一个 goroutine 可能会调用 lock,任何 goroutine 都不应该期望能够获取 读锁,直到初始读锁被释放。”

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

大致如下:

type stateful struct {
    state        int
    stateMutex   sync.Mutex
    beingUpdated bool
}

type Stateful interface {
    GetState() int
    SetState(st int)
}

func createStateful (sa string) stateful {
    return server{state: 0, stateMutex: sync.Mutex{}, beingUpdated: false}
}

func (s *stateful) SetState(st int) {
    s.stateMutex.Lock()
    s.beingUpdated = true
    s.state = st
    s.beingUpdated = false
    s.stateMutex.Unlock()
}

func (s *stateful) GetState() bool {
    if s.beingUpdated {
        // wait for s.stateMutex to be unlocked
    }

    return s.state
}

正确答案


您可能误读了sync.RWMutex docs

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

所以你的代码简化如下:

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
}

今天关于《耐心等待互斥体的到来》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>