关于golang:Go语言内存模型要点速记

52次阅读

共计 725 个字符,预计需要花费 2 分钟才能阅读完成。

倡议

对于多协程同时批改的数据,要确保序列化拜访。

能够通过 Channel 和其余同步机制(sync 和 sync/atomic 包)来爱护数据,以保障序列化拜访。

Happens-Before 准则

同 JMM,保障单协程程序程序准则。

如果事件 e1 是 happens-before 事件 e2,那么事件 e2 也 happens-after 事件 e1。如果事件 e1 不是 happens-before 事件 e2 也不是 happens-after 事件 e2,那么事件 e1 和事件 e2 被认为并发产生(concurrently)。

对变量 v 的读操作 r 可能 察看到写操作 w 必须满足:

  1. 读操作 r 不 happens-before 写操作 w。
  2. 没有其它的写操作 happens-after 写操作 w 和 happens-before 读操作 r。

对变量 v 的读操作 r 确保 察看到写操作 w 必须满足:

  1. 写操作 w 必须 happens-before 读操作 r。
  2. 其余对变量 v 的写操作要么 happens-before 写操作 w,要么 happens-after 读操作 r。

在内存模型中,对变量 v 的零值 初始化被认为是写操作。超过一个机器字值的读操作和写操作,体现为无指定程序的多个机器字大小的操作。

Go Channel

发送 happens-before 接管
敞开 happens-before 因管道敞开而返回 0 的接管
无缓冲管道:承受 happens-before 发送
容量为 C 的缓冲管道:第 k 个接管 happens-before 第 k + C 个发送

Locks

n<m: 第 n 个 Unlock() happens-before 第 m 个 Lock()

Once

多个线程都能够执行 once.Do(f),然而只有一个会运行 f(),该 f()的调用 happens-before 所有 once.Do(f)的返回。

正文完
 0