full - ¿Cómo se implementan los canales Go?
golang for range channel (1)
El archivo de origen de los canales es (desde su raíz de código fuente de go) en /src/pkg/runtime/chan.go .
hchan
es la estructura central de datos para un canal, con listas vinculadas de envío y recepción (sosteniendo un puntero a su goroutine y el elemento de datos) y una bandera closed
. Hay una estructura integrada de Lock
que se define en runtime2.go y que sirve como un mutex (futex) o semáforo en función del sistema operativo. La implementación de bloqueo se encuentra en lock_futex.go (Linux / Dragonfly / Some BSD) o lock_sema.go (Windows / OSX / Plan9 / Algunos BSD), en función de las etiquetas de compilación.
Las operaciones de canal están todas implementadas en este archivo chan.go, por lo que puede ver las operaciones de makechan, enviar y recibir, así como también las construcciones select de construir, cerrar, len y cap.
Para una gran explicación en profundidad sobre el funcionamiento interno de los canales, debes leer los canales Go con esteroides por el propio Dmitry Vyukov (Go core dev, goroutines, scheduler y channels, entre otras cosas).
Después de (brevemente) revisar las especificaciones de idioma Ir, el Go efectivo y el modelo de memoria Go, todavía no estoy muy claro cómo funcionan los canales Go bajo el capó.
¿Qué tipo de estructura son? Actúan como una cola / matriz segura para subprocesos.
¿Su implementación depende de la arquitectura?