Is Go's buffered channel lockless?

go, lockless, thread-safety

Solution

If you read the `runtime·chansend` function in chan.c, you will see that `runtime·lock` is called before the check to see if the channel is buffered `if(c->dataqsiz > 0)`.

In other words, buffered channels (and all channels in general) use locks.

The reason your search did not find it was you were looking for "Lock" with a capital L. The lock function used for channels is a non-exported C function in the runtime.

Problem

Go's buffered channel is essentially a thread-safe FIFO queue. (See Is it possible to use Go's buffered channel as a thread-safe queue?) I am wondering how it's implemented. Is it lock-free like described in Is there such a thing as a lockless queue for multiple read or write threads?? greping in Go's src directory (`grep -r Lock .|grep chan`) gives following output: ``` ./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 ``` Doesn't to be locking on my machine (MacOS, intel x86_64) though. Is there any official resource to validate this?

Original source

Related problems