De que maneiras significativas Erlang impede as condições de corrida na programação simultânea?


11

Ler sobre concorrência em Erlang me lembra o kit de ferramentas para concorrência da Akka . Ambos oferecem ferramentas para impedir ou limitar as condições de corrida . Mas você pode enviar links para dados mutáveis ​​para outros processos usando o kit de ferramentas Akka, que ainda é inseguro. Eu vejo o Akka como uma ferramenta útil, mas não fornece proteção contra acesso fora de ordem a objetos e dados, levando a condições de corrida, impasse e / ou fome. Isso não impede que você escreva códigos inseguros da maneira que Java ou C # o protege de escrever a maioria dos tipos de vazamentos de memória que você pode escrever em C ++ (você ainda pode criar vazamentos de memória em Java enganando o coletor de lixo, mas é menos de um problema do que ter que lembrar de liberar todos os bytes que você aloca).

Erlang garante um grau de correção, desempenho e robustez na programação simultânea? Eu acho que os sistemas operacionais fornecem proteção ao acessar os recursos do sistema (supondo que os gravadores de drivers tenham feito bem seu trabalho). Os bancos de dados ACID fornecem proteção para leituras e atualizações. Portanto, parece que este é um problema solucionável. Ou uma solução segura genérica apagaria os ganhos de desempenho que a simultaneidade fornece? Outros idiomas ou kits de ferramentas fornecem o tipo de segurança simultânea que Erlang oferece (ou não)?

Esta é uma pergunta de acompanhamento do comentário de @ Malfist na resposta de @ user1249 para Qual linguagem de programação gera o menor número de erros difíceis de encontrar? .

Respostas:


19

Existem algumas coisas que Erlang faz para ajudar com isso.

  • Os dados são imutáveis, portanto, não existem corridas de dados
  • Os servidores OTP gen_sf e gen_fsm fornecem um padrão muito bem testado para servidores
  • Supervisores permitem a recuperação de falhas
  • processos são pequenos e baratos
  • A memória é alocada em uma base por processo (nenhum GC congela)
  • a erlang VM é otimizada para trabalhar com cargas muito pesadas
  • O software pode ser atualizado em tempo real, portanto, não há paradas de atualização

O principal aqui é que em Erlang não há estado compartilhado que possa exigir um bloqueio, portanto, não há necessidade de bloqueios. É uma linguagem brilhante para aplicativos simples em tempo real que não precisam de tempo de inatividade e alta tolerância a falhas e simultaneidade


12
@JarrodRoberson: Na verdade, o ponto principal não é um estado mutável compartilhado . Compartilhar estado não é problema se você não o modifica. O estado mutável não é problema se você não o compartilha.
Jörg W Mittag

1
Há também uma nova ferramenta Concuerror youtube.com/watch?v=FpkjKN9wTKg que permite executar seus testes com todas as ordens de eventos possíveis
Zachary K
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.