go - 你什么时候在 Go 的结构中嵌入互斥量?

标签 go struct embed mutex

注意:我发现标题中的“嵌入”一词是错误的选择,但我会保留它。

我看到很多代码都是这样的:

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/

相关文章:

go - 解码为接口(interface)类型

perl - 在 golang 中使用模板 "N/a* N/a*"解压由 perl 打包的缓冲区

node.js - 在exe中嵌入node.js网站

go - 需要帮助了解 libchan 的工作原理

go - 步数未知的并行for循环

c - 结构声明 WLAN_AVAILABLE_NETWORK Network[1];

c - 覆盖 C 中的结构数组

C 创建一个字符串结构

ios - 嵌入 Youtube 视频 :- with contains content from * , 它被限制在某些网站上播放

ajax - 谷歌浏览器转义所见即所得的 Javascript