O que é uma condição de corrida?
sobes.tech IA
Resposta da IA
O estado de corrida é um problema que ocorre numa aplicação multithread ou multiprocessamento, quando a correção do resultado depende da ordem de execução dos threads/processos.
Geralmente ocorre quando vários threads acessam simultaneamente recursos partilhados (variáveis, ficheiros, bases de dados) sem sincronização adequada.
Leva a comportamentos imprevisíveis, erros e dados incorretos.
Exemplo: Dois threads tentam aumentar uma variável partilhada ao mesmo tempo.
var sharedCounter = 0
func incrementCounter() {
let currentValue = sharedCounter // O thread 1 lê 0
// Algum atraso
let newValue = currentValue + 1 // O thread 1 calcula 1
sharedCounter = newValue // O thread 1 escreve 1
}
// Se o thread 2 lê currentValue antes do thread 1 escrever newValue:
func anotherIncrementCounter() {
let currentValue = sharedCounter // O thread 2 lê 0
let newValue = currentValue + 1 // O thread 2 calcula 1
sharedCounter = newValue // O thread 2 escreve 1
}
Neste exemplo, se ambos os threads forem executados simultaneamente sem sincronização, no final sharedCounter pode tornar-se 1 em vez do esperado 2.
Para evitar condições de corrida, usam-se mecanismos de sincronização:
- Mutex (Exclusão Mútua): Bloqueia o acesso a um recurso, permitindo que apenas um thread esteja na secção crítica.
- Semáforos (Semaphore): Limitam o número de threads que podem aceder a um recurso ao mesmo tempo.
- Filas (Dispatch Queues em GCD): A execução de tarefas ocorre sequencialmente (para filas seriais) ou com um nível definido de paralelismo (para filas concorrentes), com possibilidade de sincronizar o acesso.
- Locks (Trancas): Diversos tipos de locks (por exemplo,
NSLock,NSRecursiveLock). - Operações atómicas (Atomic Operations): Garantem que a operação (leitura, escrita, incremento) seja realizada de forma atómica, ou seja, não pode ser interrompida por outro thread.
No desenvolvimento iOS, usa-se frequentemente Grand Central Dispatch (GCD) e Operation Queues para gerir threads e prevenir condições de corrida. As Dispatch Queues seriais garantem a sincronização automática das tarefas executadas nesta fila.