De quelles manières significatives Erlang empêche-t-il les conditions de concurrence dans la programmation simultanée?

11

La lecture sur la concurrence dans Erlang , me rappelle la boîte à outils de concurrence Akka . Les deux vous donnent des outils pour empêcher ou limiter les conditions de course . Mais vous pouvez envoyer des liens vers des données mutables vers d'autres processus à l'aide de la boîte à outils Akka, qui n'est toujours pas sûre. Je considère Akka comme un outil utile, mais il ne fournit pas de protection contre un accès hors service aux objets et aux données conduisant à des conditions de concurrence, à un blocage et / ou à la famine. Cela ne vous empêche pas d'écrire du code dangereux de la façon dont Java ou C # vous protège contre l'écriture de la plupart des types de fuites de mémoire que vous pouvez écrire en C ++ (vous pouvez toujours créer des fuites de mémoire en Java en trompant le garbage collector, mais c'est moins problème que de ne pas oublier de libérer chaque octet que vous allouez).

Erlang garantit-il un degré d'exactitude, de performance et de robustesse dans la programmation simultanée? Je pense que les systèmes d'exploitation offrent une protection lors de l'accès aux ressources système (en supposant que les rédacteurs de pilotes ont bien fait leur travail). Les bases de données ACID offrent une protection pour les lectures et les mises à jour. Il semble donc que ce soit un problème résoluble. Ou une solution générique sûre effacerait-elle les gains de performances que fournit la concurrence? D'autres langues ou kits d'outils offrent-ils le type de sécurité simultanée qu'Erlang offre (ou non)?

Il s'agit d'une question complémentaire au commentaire de @ Malfist sur la réponse de @ user1249 à Quel langage de programmation génère le moins de bogues difficiles à trouver? .

GlenPeterson
la source

Réponses:

19

Il y a quelques choses qu'Erlang fait pour les aider.

  • Les données sont immuables, donc aucune course aux données
  • OTP gen_servers et gen_fsm fournissent un modèle très bien testé pour les serveurs
  • Les superviseurs permettent de récupérer après un crash
  • les processus sont petits et bon marché
  • La mémoire est allouée par processus (pas de gel du GC)
  • l'erlang VM est optimisé pour fonctionner sous des charges très lourdes
  • Le logiciel peut être mis à jour à la volée, donc aucun temps d'arrêt de mise à niveau

La principale chose ici est qu'à Erlang, il n'y a pas d'état partagé qui pourrait nécessiter un verrou, donc il n'y a pas besoin de verrous. C'est un langage brillant pour les applications en temps réel souples qui n'ont besoin d'aucun temps d'arrêt et d'une tolérance aux pannes et d'une concurrence élevées

Zachary K
la source
12
@JarrodRoberson: En fait, le point principal n'est pas un état mutable partagé . Le partage de l'état n'est pas un problème si vous ne le mutez pas. L'état mutable ne pose aucun problème si vous ne le partagez pas.
Jörg W Mittag
1
Il y a aussi un nouvel outil Concuerror youtube.com/watch?v=FpkjKN9wTKg qui vous permet d'exécuter vos tests avec toutes les commandes d'événements possibles
Zachary K