Gos gepufferter Kanal ist im Wesentlichen eine Thread-sichere FIFO-Warteschlange. (Siehe Is it possible to use Go's buffered channel as a thread-safe queue?)Ist der gepufferte Kanal von Go gesperrt?
Ich frage mich, wie es umgesetzt wird. Ist es wie in Is there such a thing as a lockless queue for multiple read or write threads? beschrieben sperrefrei?
in Gos src Verzeichnis greping (grep -r Lock .|grep chan
) ergibt folgende Ausgabe:
./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
Hat auf meinem Rechner (MacOS, Intel x86_64), wenn auch nicht zu sperren. Gibt es eine offizielle Ressource, um dies zu bestätigen?
Danke! Irgendwelche Ideen darüber, warum es nicht als Lock-Free implementiert ist? –
"Lockfree" bedeutet keine bessere Leistung. Es ist auch einfacher, über Sperren zu begründen. Die Lock-Methode ist wahrscheinlich schneller, wenn es zu hohen Konflikten kommt. –
Danke, @ stephen-weinberg. Das macht jetzt mehr Sinn. –