sync.WaitGroup是“同步原语”吗?

时间:2017-12-11 21:27:43

标签: multithreading go synchronization memory-model

go memory model文件说

  

要序列化访问,请使用通道操作或其他同步原语(例如同步和同步/原子包中的原语)保护数据。

sync package

  

包同步提供基本同步原语,例如互斥锁

因此,我们可以得出结论sync.Mutex是一个同步原语。还有一个非常强烈的提示,即该包中的其他类型是同步原语。但是,它没有明确说明,例如, sync.WaitGroup是。

阅读source of WaitGroup,我无法完全说服自己内存操作不会在WaitGroup函数周围重新排列(例如,与java的synchronized关键字一样) 。我相信它在序列化之前/之后,但我怎么能确定。

sync.WaitGroup是“同步原语”吗?我不是简单地寻找答案“是”(或者说“不”),而是可以证明这种情况的指针。

2 个答案:

答案 0 :(得分:3)

如果你反对明智的advice并一直跟着乌龟......

wg.Add()指向第63行,该第63行指向atomic.AddUint64(),导致此汇编代码:

LOCK
XADDQ   AX, 0(BP)

另一方面wg.Wait()导致第121行导致atomic.CompareAndSwapUint64()导致:

LOCK
CMPXCHGQ    CX, 0(BP)

这显然就是你如何构建WaitGroup :)。使用锁定原子交换并添加锁定原子比较和交换。对我来说非常有说服力。你无法对抗汇编程序。好吧也许你可以我不能。

x86 locks

答案 1 :(得分:2)

temp_file = TemporaryFile() with open('path/to/pic.jpg', 'wb') as f: temp_file.write(f) temp_file.seek(0) pil_img = Image.open(temp_file) cv_img = cv2.imread(temp_file) 已同步。如果您阅读了源代码,您将看到它使用sync/atomic来同步计数器上的操作。