Race Condition (Condição de corrida): Uma condição de
corrida é uma falha em um sistema ou processo em que o
resultado do processo é inesperadamente dependente da sequência ou sincronia de outros eventos. Apesar de ser conhecido em português por 'condição de corrida' uma tradução melhor seria 'condição de concorrência' pois o problema está relacionado justamente ao gerenciamento da concorrência entre processos teoricamente simultâneos. O fenômeno pode ocorrer em sistemas eletrônicos, especialmente em circuitos lógicos, e em programas de computador, especialmente no uso de multitarefa ou computação distribuída. Deadlock (Interbloqueio, blocagem, impasse): No contexto de sistemas operacionais (SO), refere-se a uma situação em que ocorre um impasse, e dois ou mais processos ficam impedidos de continuar suas execuções, ou seja, ficam bloqueados, esperando uns pelos outros. Trata-se de um problema bastante estudado em sistemas operacionais e banco de dados, pois é inerente à própria natureza desses sistemas. O deadlock ocorre com um conjunto de processos e recursos não-preemptíveis, onde um ou mais processos desse conjunto está aguardando a liberação de um recurso por outro processo, o qual, por sua vez, aguarda a liberação de outro recurso alocado ou dependente do primeiro processo. Livelock: Na computação simultânea, um impasse é um estado no qual cada membro de um grupo de ações está aguardando que outro membro libere um bloqueio. Um livelock é semelhante a um impasse, exceto que os estados dos processos envolvidos no livelock mudam constantemente um em relação ao outro, nenhum progredindo. Livelock é um caso especial de inanição de recursos; a definição geral afirma apenas que um processo específico não está progredindo. Um exemplo real de livelock ocorre quando duas pessoas se encontram em um corredor estreito, e cada uma tenta ser educada movendo-se para o lado para deixar o outro passar, mas elas acabam balançando de um lado para o outro sem progredir, porque ambas se movem repetidamente da mesma maneira ao mesmo tempo. Livelock é um risco em alguns algoritmos que detectam e se recuperam de um conflito. Se mais de um processo executar uma ação, o algoritmo de detecção de deadlock poderá ser acionado repetidamente. Isso pode ser evitado, garantindo que apenas um processo (escolhido aleatoriamente ou por prioridade) tome medidas. Concorrência versus Paralelismo: A programação concorrente, ou escrever software concorrente, pode ser bastante complicado. Primeiro devem ser identificados aspectos concorrentes no problema a ser resolvido. Depois, o programa deve ser capaz de gerenciar como os dados são acessados e compartilhados entre as tarefas. Portanto a interação, comunicação e a coordenação entre as tarefas são as questões centrais de um sistema concorrente. Quanto ao paralelismo, seria o tratamento de uma tarefa complexa, que é dividida em um conjunto de tarefas menores relacionadas que cooperam entre si para a realização da tarefa maior, e são processadas de maneira independente e simultânea em múltiplas unidades de processamento (cores e CPU’s). A programação paralela é a aplicação da concorrência. Não existe paralelismo sem concorrência. Não existe a base de hardware instalada necessária hoje para alavancar o desenvolvimento em larga escala de sistemas concorrentes. Claro que é possível o desenvolvimento de software em paradigma concorrente para um processador com apenas um núcleo, porém não é aí que o paradigma é mais bem utilizado. Além disso, é necessário um maior grau de conhecimento e treinamento do desenvolvedor para chegar a bons resultados sem problemas de controle dos threads. As linguagens de programação oferecem bibliotecas e compiladores para o desenvolvimento, porém não há grande interesse na mudança de paradigma, ainda é difícil hoje encontrar pessoas que deixem as facilidades do paradigma estruturado. A programação concorrente exige tempo, investimento em treinamento, depuração e testes maiores, pois existem mais situações a prever e maiores possibilidades de erros ou conflitos nas aplicações devido à necessidade de sincronia perfeita entre os threads.