Aula 12: Data Races, Deadlock e Atomicidade
Esta aula aprofunda três ameaças difíceis de depurar: data race (definição precisa em C++), deadlock (duas threads esperando uma pela outra), e operações atômicas (std::atomic) como alternativa leve ao mutex para contadores simples.
data race = duas pessoas escrevendo no mesmo papel ao mesmo tempo. deadlock = duas pessoas seguram o que a outra precisa e ficam esperando. atomic = uma operação inteira — impossível de interromper no meio.
- data race
- Segundo o padrão C++: duas threads acessam o mesmo local de memória, pelo menos uma escreve, e não há synchronisation entre elas. Causa undefined behavior.
- undefined behavior
- Uma situação em que o padrão C++ não define o que vai acontecer — o compilador pode gerar qualquer código, incluindo crash, valores errados, ou até 'funcionar' às vezes.
- deadlock
- Um estado em que duas ou mais threads ficam esperando uma pela outra para liberar um mutex, e nenhuma consegue avançar — para sempre.
- atomic
- Uma operação que é executada como uma unidade indivisível. std::atomic<T> em C++ garante que um read-modify-write não seja interrompido por outra thread.
- compare-exchange
- Uma operação atômica que compara o valor atual com um valor esperado; se forem iguais, troca pelo novo valor. Base dos algoritmos lock-free.