猿问

Go的缓冲通道是否无锁?

在Go的src目录(grep -r Lock .|grep chan)中进行greping会给出以下输出:


./pkg/runtime/chan.c:   Lock;

./pkg/runtime/chan_test.go: m.Lock()

./pkg/runtime/chan_test.go: m.Lock() // wait

./pkg/sync/cond.go: L Locker // held while observing or changing the condition

不过不要锁定我的机器(MacOS,intel x86_64)。是否有任何官方资源可以对此进行验证?


慕盖茨4494581
浏览 160回答 2
2回答

慕的地8271018

如果您runtime·chansend在chan.c中阅读该函数,您将看到runtime·lock在检查通道是否被缓冲之前调用了该函数if(c->dataqsiz > 0)。换句话说,缓冲的通道(以及通常所有通道)都使用锁。搜索未找到它的原因是,您正在寻找大写字母L的“锁定”。用于通道的锁定功能是运行时中未导出的C函数。
随时随地看视频慕课网APP

相关分类

Go
我要回答