要序列化访问,请使用通道操作或其他同步原语(例如同步和同步/原子包中的原语)保护数据。
包同步提供基本同步原语,例如互斥锁
因此,我们可以得出结论sync.Mutex
是一个同步原语。还有一个非常强烈的提示,即该包中的其他类型是同步原语。但是,它没有明确说明,例如, sync.WaitGroup
是。
阅读source of WaitGroup,我无法完全说服自己内存操作不会在WaitGroup
函数周围重新排列(例如,与java的synchronized
关键字一样) 。我相信它在序列化之前/之后,但我怎么能确定。
sync.WaitGroup
是“同步原语”吗?我不是简单地寻找答案“是”(或者说“不”),而是可以证明这种情况的指针。
答案 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
:)。使用锁定原子交换并添加和锁定原子比较和交换。对我来说非常有说服力。你无法对抗汇编程序。好吧也许你可以我不能。
答案 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
来同步计数器上的操作。