Il canale buffer di Go è essenzialmente una coda FIFO thread-safe. (Vedi Is it possible to use Go's buffered channel as a thread-safe queue?)Il canale bufferizzato di Go è lockless?
Mi chiedo come sia implementato. È privo di blocco come descritto in Is there such a thing as a lockless queue for multiple read or write threads??
greping nella directory src del Go (grep -r Lock .|grep chan
) fornisce output seguente:
./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
non fa per essere di blocco sulla mia macchina (MacOS, Intel x86_64) però. C'è qualche risorsa ufficiale per convalidare questo?
Grazie! Qualche idea sul perché non è implementata come lock-free? –
"Lockfree" non implica prestazioni migliori. È anche più facile ragionare sulle serrature. Il metodo di blocco è probabilmente più veloce in caso di contesa elevata. –
Grazie, @ stephen-weinberg. Ciò ha più senso ora. –