Sobes.tech
Junior

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.