Condição de corrida
Uma condição de corrida ocorre quando um programa de software depende do momento em que um ou mais processos são executados para funcionar corretamente. Se uma thread for executada ou terminar em um momento inesperado, isso poderá causar um comportamento imprevisível, como uma saída incorreta ou um deadlock do programa.
A maioria dos programas de software é multithread, o que significa que pode processar várias threads ao mesmo tempo. Um aplicativo bem programado garantirá que os resultados de cada thread sejam processados na ordem esperada. Se um programa depender de threads executadas em uma sequência imprevisível, poderá ocorrer uma condição de corrida.
Um exemplo simples é uma porta lógica que processa valores booleanos. A porta lógica AND tem duas entradas e uma saída. Se as entradas A e B forem verdadeiras, a porta AND produzirá TRUE. Se uma ou ambas as entradas forem falsas, ela produzirá FALSE. Uma condição de corrida poderá ocorrer se um programa verificar o resultado da porta lógica antes que as variáveis A e B sejam carregadas. O processo correto seria:
- Carregar a variável A
- Carregar a variável B
- Verificar o resultado da porta lógica AND
Uma sequência incorreta seria:
- Carregar a variável A
- Verificar o resultado da porta lógica AND
- Carregar a variável B
O resultado do segundo exemplo acima pode ou não ser igual ao do primeiro exemplo. Por exemplo, a variável B pode ser FALSE antes e depois de ser carregada, o que não mudaria o resultado. Se A for FALSE, não importa se B é TRUE ou FALSE. No entanto, se A e B forem verdadeiras, o resultado deverá ser TRUE. Carregar a variável B depois de verificar o resultado da porta lógica produziria um resultado incorreto de FALSE.
A saída inconsistente produzida por condições de corrida pode causar bugs difíceis de detectar. Os programadores podem evitar esses problemas garantindo que as threads sejam processadas em uma sequência consistente.
Teste seus conhecimentos