Sobes.tech
Middle

Explique o que é uma corrida de dados no contexto do desenvolvimento multithread.

sobes.tech IA

Resposta da IA

Data race é um estado em que vários threads ou processos acedem simultaneamente à mesma área de memória (variável, objeto) e pelo menos um deles realiza uma escrita, sem qualquer sincronização de acesso.

As consequências de uma data race são imprevisíveis e podem incluir:

  • Valores incorretos das variáveis.
  • Crashes na aplicação.
  • Outros erros difíceis de detectar.

Exemplo de data race em Swift:

// Contador não protegido
var counter = 0

// Função que incrementa o contador numa thread
func incrementCounter() {
    for _ in 0..<1000 {
        counter += 1 // Aqui ocorre uma data race
    }
}

// Criação e execução de múltiplas threads
let queue = DispatchQueue.global()
queue.async {
    incrementCounter()
}

queue.async {
    incrementCounter()
}

// Como resultado, counter pode não ser igual a 2000

Formas de prevenir a data race:

  • Locks: NSLock, os_unfair_lock.
  • Mutexes: Usados com pthread_mutex.
  • Semáforos: DispatchSemaphore.
  • Filas concorrentes com barreiras: DispatchQueue(label: "myQueue", attributes: .concurrent) com a flag .barrier ao escrever.
  • Synchronized (Objective-C): @synchronized.
  • Operações atômicas: Uso de tipos atômicos, como AtomicBool.
  • Estruturas de dados seguras para acesso concorrente: Por exemplo, NSCache ou bibliotecas especializadas.