go - programacion - Si estoy usando los canales correctamente, ¿debo usar mutexes?
programacion concurrente y paralelismo (1)
No necesita mutex si usa los canales correctamente. Sin embargo, en algunos casos, una solución con mutex podría ser más simple.
Solo asegúrese de que las variables que contienen los valores del canal se inicialicen correctamente antes de que varias gorutinas intenten acceder a las variables del canal. Una vez hecho esto, acceder a los canales (p. Ej., Enviar valores a ellos o recibirlos) es seguro por diseño.
Documentos de respaldo con referencias (énfasis agregado por mí):
Especificaciones: tipos de canales:
Se puede usar un solo canal en las declaraciones de envío , las operaciones de recepción y las llamadas al
cap
funciones incorporadas por cualquier cantidad de goroutines sin sincronización adicional . Los canales actúan como colas de primero en entrar, primero en salir. Por ejemplo, si una gorutina envía valores en un canal y una segunda gorutina los recibe, los valores se reciben en el orden enviado.
Ir efectivo: concurrencia: compartir comunicando
La programación concurrente en muchos entornos se dificulta por las sutilezas necesarias para implementar el acceso correcto a las variables compartidas. Go fomenta un enfoque diferente en el que los valores compartidos se transmiten en los canales y, de hecho, nunca se comparten activamente por hilos de ejecución separados. Solo una gorutina tiene acceso al valor en un momento dado. Las carreras de datos no pueden ocurrir, por diseño. Para fomentar esta forma de pensar, la hemos reducido a un eslogan:
No se comunique compartiendo memoria; en cambio, comparta memoria comunicándose.
Este enfoque puede llevarse demasiado lejos. Los recuentos de referencia se pueden hacer mejor colocando un mutex alrededor de una variable entera, por ejemplo. Pero como enfoque de alto nivel, el uso de canales para controlar el acceso hace que sea más fácil escribir programas claros y correctos.
Este artículo también es muy útil: el modelo Go Memory
También citando del paquete doc de
sync
:
La sincronización de paquetes proporciona primitivas básicas de sincronización, como bloqueos de exclusión mutua. Aparte de los tipos Once y WaitGroup, la mayoría están destinados a ser utilizados por rutinas de biblioteca de bajo nivel. La sincronización de nivel superior se realiza mejor a través de canales y comunicación.
Si estoy usando los canales correctamente, ¿debo usar mutexes para proteger contra el acceso concurrente?