Sobes.tech
Middle

Como eliminar condições de corrida ao trabalhar com threads concorrentes usando GCD?

sobes.tech IA

Resposta da IA

No GCD (Grand Central Dispatch), para evitar condições de corrida ao trabalhar com threads concorrentes, utiliza-se a sincronização de acesso a recursos comuns. As abordagens principais:

  • Uso de filas sequenciais (serial): se todas as operações com um recurso compartilhado forem realizadas numa única fila serial, elas serão executadas por ordem, evitando acesso simultâneo.

  • Uso de barreiras (barrier blocks) em filas concorrentes: as barreiras garantem que todas as tarefas anteriores terminem antes de iniciar a barreira, e as tarefas seguintes começam após ela.

Exemplo de uso de uma fila serial para proteger um recurso:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")
var sharedResource = 0

func incrementResource() {
    serialQueue.async {
        sharedResource += 1
        print("Recurso incrementado para \(sharedResource)")
    }
}

Dessa forma, as operações com sharedResource não serão executadas simultaneamente, prevenindo condições de corrida.