2013-10-27 12 views
40

Nachdem ich (kurz) die Go-Sprachspezifikation, das effektive Go- und das Go-Speichermodell überprüft habe, bin ich immer noch ein wenig unklar, wie Go-Kanäle unter der Haube funktionieren.Wie werden Go-Kanäle implementiert?

Welche Art von Struktur sind sie? Sie verhalten sich quasi wie eine thread-sichere Queue/Array.

Ist die Implementierung von der Architektur abhängig?

Antwort

56

Die Quelldatei für Kanäle ist (von Ihrem Quellcode root) in /src/pkg/runtime/chan.go.

hchan ist die zentrale Datenstruktur für einen Kanal mit verknüpften Listen zum Senden und Empfangen (mit einem Zeiger auf ihre Goroutine und das Datenelement) und einem closed Flag. Es gibt eine Lock eingebettete Struktur, die in runtime2.go definiert ist und je nach Betriebssystem als Mutex (Futex) oder Semaphor dient. Die Locking-Implementierung ist in lock_futex.go (Linux/Dragonfly/Some BSD) oder lock_sema.go (Windows/OSX/Plan9/Some BSD), basierend auf den Build-Tags.

In dieser chan.go-Datei sind alle Kanaloperationen implementiert, sodass Sie die Operationen makechan, send und receive sowie die Konstrukt-, Schließen-, Len- und Cap-Konstrukte auswählen können.

Für eine eingehende Erklärung über die inneren Funktionen von Kanälen, müssen Sie lesen Go channels on steroids von Dmitry Vyukov selbst (Go-Core-Entwickler, goroutines, Scheduler und Kanäle unter anderem).

Verwandte Themen