gpt4 book ai didi

go - 同一结构中的多个互斥体?

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

我有一些关于 Go 的 sync.Mutexstruct 一起使用的相关问题。例如,如果我有这个 struct:

type something struct {
aMux sync.Mutex
a map[string]interface{}

bMux sync.Mutex
b int
}

... 锁定 bMux 并访问 b 同时锁定 aMux 并访问 a 是否安全 没有竞争条件?

了解我正在访问指向结构的指针,并使用类似这样的方法同时锁定/解锁互斥量可能也有帮助:

func (s *something) addA(k string, v interface{}) {
(*s).aMux.Lock()
(*s).a[k] = v
(*s).aMux.Unlock()
}

func (s *something) addB(k string, v interface{}) {
(*s).bMux.Lock()
(*s).b++
(*s).bMux.Unlock()
}

我的假设是这在理论上应该是安全的,因为您已经可以在结构中锁定互斥量而不必访问它锁定的字段。 但是当像上面那样取消引用 struct 时,Go 是否从 struct 复制所有值(使其不安全),或者它是否只修改/检索您的字段指定?

我非常希望将互斥量保留在同一个结构中,因为在我的代码中,我在同一个结构中有多个(最多六个)相关字段,我用互斥量分别锁定。 如果在同一个结构(对于相关字段)中有多个互斥体是安全的,但不推荐或不好的做法,为什么?什么是更好的结构?

最佳答案

在单个结构中拥有多个互斥量应该是安全的。请注意不要按值传递结构,因为互斥体不是引用类型并且复制它们是错误的(有关更多详细信息,请参见 this discussion)。

您不需要显式取消引用,Go 会为您完成:

func (s *something) addA(k string, v interface{}) {
s.aMux.Lock()
s.a[k] = v
s.aMux.Unlock()
}

应该也能正常工作(在 Go tour 中)。

虽然我会说这不是很常见的设计。如果可能的话,我更喜欢互斥锁来锁定整个结构。一旦你进行了非常细粒度的锁定,你就必须非常小心,我会先探索其他选择。

关于go - 同一结构中的多个互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54681678/

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