注意:我发现标题中的“嵌入”一词是错误的选择,但我会保留它。
我看到很多代码都是这样的:
type A struct {
mu sync.Mutex
...
}
然后像这样使用它:
a := &A{}
a.mu.Lock()
defer a.mu.Unlock()
a.Something()
它比局部互斥还是全局互斥更好?
a := &A{}
var mu sync.Mutex
mu.Lock()
defer mu.Unlock()
a.Something()
什么时候应该使用前者,还是后者?
最佳答案
最好让互斥锁靠近它要保护的数据。如果互斥锁应该保护对结构值字段的并发访问,那么将互斥锁添加为该结构的字段非常方便,因此其目的很明显。
如果在您的应用中只有一个 A
的“实例”,那么也可以将互斥体设为全局变量。
如果您的应用程序要创建 A
的多个值,所有这些值都需要防止并发访问(但只是单独地,可以同时访问多个值),那么显然全局互斥锁是这是一个糟糕的选择,它会限制在任何时间点对 A
的单个值的并发访问。
将互斥锁作为字段添加到结构中,您将自然地为每个不同的结构值拥有一个单独的互斥锁,负责保护单个包装结构值(或其字段)。
虽然在您的示例中添加互斥量不是嵌入,但它是一个常规的命名字段。一个embedded field declaration省略字段名称。
它为人所知并在较小程度上使用,但它也很方便,您可以“真正地”在结构中嵌入互斥量,并且可以调用 Lock()
和 Unlock()
就好像它们是结构本身的一部分一样。它看起来像这样:
var hits struct {
sync.Mutex
n int
}
hits.Lock()
hits.n++
hits.Unlock()
(本例取自10 things you (probably) don't know about Go, slide #3。)
关于go - 你什么时候在 Go 的结构中嵌入互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44949467/