¿De qué manera significativa Erlang previene las condiciones de carrera en la programación concurrente?

11

Leer acerca de la concurrencia en Erlang me recuerda el conjunto de herramientas de concurrencia de Akka . Ambos le brindan herramientas para prevenir o limitar las condiciones de carrera . Pero puede enviar enlaces a datos mutables a otros procesos utilizando el kit de herramientas de Akka, que aún no es seguro. Veo a Akka como una herramienta útil, pero no proporciona protección contra el acceso fuera de orden a objetos y datos que conducen a condiciones de carrera, punto muerto y / o inanición. No le impide escribir código inseguro de la forma en que Java o C # lo protege de escribir la mayoría de los tipos de pérdidas de memoria que puede escribir en C ++ (aún puede crear pérdidas de memoria en Java engañando al recolector de basura, pero es menos de un problema que tener que recordar liberar cada byte que asignes).

¿Erlang garantiza un grado de corrección, rendimiento y solidez en la programación concurrente? Creo que los sistemas operativos proporcionan protección al acceder a los recursos del sistema (suponiendo que los escritores de controladores hicieron bien su trabajo). Las bases de datos ACID proporcionan protección para lecturas y actualizaciones. Entonces parece que este es un problema solucionable. ¿O una solución segura genérica borraría las ganancias de rendimiento que proporciona la concurrencia? ¿Proporcionan otros idiomas o kits de herramientas el tipo de seguridad concurrente que Erlang ofrece (o no)?

Esta es una pregunta de seguimiento al comentario de @ Malfist sobre la respuesta de @ user1249 a ¿Qué lenguaje de programación genera la menor cantidad de errores difíciles de encontrar? .

GlenPeterson
fuente

Respuestas:

19

Erlang hace algunas cosas para ayudar con esto.

  • Los datos son inmutables, por lo que no hay carreras de datos
  • OTP gen_servers y gen_fsm's proporcionan un patrón muy bien probado para servidores
  • Los supervisores permiten la recuperación de accidentes
  • los procesos son pequeños y baratos
  • La memoria se asigna por proceso (no se congela el GC)
  • Erlang VM está optimizado para trabajar bajo cargas muy pesadas
  • El software se puede actualizar sobre la marcha, por lo que no hay tiempos de inactividad de actualización

Lo más importante aquí es que en Erlang no hay un estado compartido que pueda requerir un bloqueo, por lo que no hay necesidad de bloqueos. Es un lenguaje brillante para aplicaciones suaves en tiempo real que no necesitan tiempo de inactividad y alta tolerancia a fallas y concurrencia.

Zachary K
fuente
12
@JarrodRoberson: En realidad, el punto principal no es un estado mutable compartido . Compartir estado no es un problema si no lo mutas. El estado mutable no es un problema si no lo comparte.
Jörg W Mittag
1
También hay una nueva herramienta Concuerror youtube.com/watch?v=FpkjKN9wTKg que le permite ejecutar sus pruebas con todos los pedidos de eventos posibles
Zachary K