Goのバッファされたチャネルは、基本的にスレッドセーフなFIFOキューです。 (Is it possible to use Go's buffered channel as a thread-safe queue?を参照してください)Goのバッファリングされたチャネルはロックレスですか?
どのように実装されているのだろうか。それはIs there such a thing as a lockless queue for multiple read or write threads?に記載されているようにロックフリーですか?ゴーの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の、インテルx86_64版)にロックすることはありません。これを検証する正式なリソースはありますか?
ありがとうございます!なぜそれがロックフリーとして実装されていないかについてのアイデア? –
"Lockfree"はより良いパフォーマンスを意味しません。また、ロックの理由を考えるのも簡単です。競合が高かった場合、おそらくLockメソッドが高速になります。 –
ありがとう、@ stephen-weinberg。それは今より意味をなさない。 –