-1

我有一个大而深嵌套的共享结构。我的程序的每个 goroutine 都可能使用结构的不同部分、切片、映射等。更糟糕的是,所有这些 goroutine 都执行长操作,这意味着为此使用大锁可能不是一个好主意共享结构。因此,我想出了一个想法,即在访问结构的一部分之前锁定结构,然后对其进行编码,一旦编码完成,goroutine 就可以释放锁并解码数据。这样,单个 goroutine 不会长时间持有锁。问题是:我不确定这是否是一个好习惯,有没有更好的方法来解决这类问题?或者有没有更好的意识形态来解决这类问题?

4

1 回答 1

0

您可以使用以下技术代替 sync.Mutex:

  • sync.RWMutex- 读写锁允许多个goroutine同时读取结构,并且只有在没有获得写锁的情况下。如果您的问题是多个 goroutine 无法并行编码 struct 的不同部分,那么这可能是最佳选择。
  • 您可以像问题中提到的那样细化锁,但是当您修改结构的不同部分时,您必须小心正确获取所有涉及的锁以保持一致性。
  • 您可以在 lock 下拍摄 struct 的有趣部分的快照,并在外部 lock 执行一些繁重的读取操作。这当然会给 GC 带来额外的压力,但它可能是值得的。

您也可以混合它们以获得更好的结果。

于 2021-08-11T05:45:53.597 回答