Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 同一结构中有多个互斥体?_Go_Struct_Concurrency_Mutex - Fatal编程技术网

Go 同一结构中有多个互斥体?

Go 同一结构中有多个互斥体?,go,struct,concurrency,mutex,Go,Struct,Concurrency,Mutex,我有一些关于Go的sync.Mutex与struct一起使用的相关问题。例如,如果我有这个结构: 。。。在没有竞争条件的情况下同时锁定aMux和访问a时锁定bMux和访问b是否安全 知道我正在访问指向结构的指针,并使用类似这样的方法同时锁定/解锁互斥锁,可能也会有所帮助: func (s *something) addA(k string, v interface{}) { (*s).aMux.Lock() (*s).a[k] = v (*s).aMux.Unlock()

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

。。。在没有竞争条件的情况下同时锁定aMux和访问a时锁定bMux和访问b是否安全

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

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()
}
我的假设是,理论上这应该是安全的,因为您已经可以在结构中锁定互斥体,而不必访问它锁定的字段。但是,当解除对上述结构的引用时,是否会复制该结构中的所有值以使其不安全,还是只修改/检索您指定的字段


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

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

您不需要显式解引用,请执行以下操作:

func (s *something) addA(k string, v interface{}) {
    s.aMux.Lock()
    s.a[k] = v
    s.aMux.Unlock()
}
应该也能用的很好它在


我想说这不是很常见的设计。如果可能的话,我希望使用互斥锁来锁定整个结构。一旦你进行了非常细粒度的锁定,你就必须非常小心,我将首先探讨其他选项。

在一个结构中有多个互斥锁应该是安全的。请注意不要按值传递结构,因为互斥量不是引用类型,复制它们是错误的。有关更多详细信息,请参阅

您不需要显式解引用,请执行以下操作:

func (s *something) addA(k string, v interface{}) {
    s.aMux.Lock()
    s.a[k] = v
    s.aMux.Unlock()
}
应该也能用的很好它在

我想说这不是很常见的设计。如果可能的话,我希望使用互斥锁来锁定整个结构。一旦您进行了非常细粒度的锁定,就必须非常小心,我将首先探讨其他选项

是的,在结构中可以有多个互斥体 不要过于复杂:您可以使用一个互斥来保护对结构中两个元素中任意一个的访问,即任何修改map或int的操作都可以共享同一个互斥 当从其他函数引用结构时(像方法一样使用指针),确保结构不被复制。复制的结构(带有mutex)将导致不可预测/不安全的结果 来自golang:

不应复制包含此包中定义的类型(即sync.Mutux)的值

是的,在结构中可以有多个互斥体 不要过于复杂:您可以使用一个互斥来保护对结构中两个元素中任意一个的访问,即任何修改map或int的操作都可以共享同一个互斥 当从其他函数引用结构时(像方法一样使用指针),确保结构不被复制。复制的结构(带有mutex)将导致不可预测/不安全的结果 来自golang:

不应复制包含此包中定义的类型(即sync.Mutux)的值


@阿德里安:你可以对初学者更友善一些。因为s是一个指针,所以想要取消引用它是合理的,除非您知道Go在某些情况下可以自动执行此操作。这当然不是代码nonsensical@Adrian例如你可以对初学者更友善一些。因为s是一个指针,所以想要取消引用它是合理的,除非您知道Go在某些情况下可以自动执行此操作。这当然不会让代码变得毫无意义