共计 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 必须满足:
- 读操作 r 不 happens-before 写操作 w。
- 没有其它的写操作 happens-after 写操作 w 和 happens-before 读操作 r。
对变量 v 的读操作 r 确保 察看到写操作 w 必须满足:
- 写操作 w 必须 happens-before 读操作 r。
- 其余对变量 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)的返回。
正文完