【发布时间】:2017-12-11 21:27:42
【问题描述】:
go memory model 文件说
要序列化访问,请使用通道操作或其他同步原语(例如同步和同步/原子包中的同步原语)保护数据。
包同步提供基本的同步原语,例如互斥锁
因此我们可以得出结论sync.Mutex 是一个同步原语。还有一个非常强烈的暗示,即该包中的其他类型是同步原语。但是,它并没有明确说明,例如sync.WaitGroup 是。
阅读source of WaitGroup,我无法完全说服自己不会围绕WaitGroup 函数重新安排内存操作(例如,我可以使用java 的synchronized 关键字)。我相信它在之前/之后进行序列化,但我怎么能确定。
sync.WaitGroup 是“同步原语”吗?我不只是在寻找答案“是”(或“否”),而是寻找可以证明这一点的指针。
【问题讨论】:
-
WaitGroup 如果不是同步原语就不会很有用。
-
它也不在
sync包中。 -
感谢 cmets。但是,除了“直观”级别之外,它并没有真正回答我的问题。这段代码或保证在
WaitGroup访问之前/之后不会重新排列内存访问的文档是什么?
标签: multithreading go synchronization memory-model