Goのバッファリングされたチャネルは、基本的にスレッドセーフなFIFOキューです。(Goのバッファリングされたチャネルをスレッドセーフキューとして使用することは可能ですか?を参照してください。 )
どのように実装されているのだろうか。「複数の読み取りまたは書き込みスレッド用のロックレスキューなどはありますか?」で説明されているように、ロックフリーですか??
Goのsrcディレクトリ(grep -r Lock .|grep chan
)でgrepを実行すると、次の出力が得られます。
./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)をロックすることはありません。これを検証するための公式リソースはありますか?