Sobes.tech
Junior

Czym jest warunek wyścigu?

sobes.tech AI

Odpowiedź od AI

Stan wyścigu to problem, który pojawia się w wielowątkowej lub wieloprocesowej aplikacji, gdy poprawność wyniku zależy od kolejności wykonywania wątków/procesów.

Zazwyczaj występuje, gdy wiele wątków jednocześnie uzysku dostęp do współdzielonych zasobów (zmiennych, plików, baz danych) bez odpowiedniej synchronizacji.

Prowadzi to do nieprzewidywalnego zachowania, błędów i niepoprawnych danych.

Przykład: Dwa wątki próbują jednocześnie zwiększyć wspólną zmienną.

var sharedCounter = 0

func incrementCounter() {
    let currentValue = sharedCounter // Wątek 1 odczytuje 0
    // Opóźnienie
    let newValue = currentValue + 1 // Wątek 1 oblicza 1
    sharedCounter = newValue // Wątek 1 zapisuje 1
}

// Jeśli wątek 2 odczytuje currentValue zanim wątek 1 zapisze newValue:
func anotherIncrementCounter() {
    let currentValue = sharedCounter // Wątek 2 odczytuje 0
    let newValue = currentValue + 1 // Wątek 2 oblicza 1
    sharedCounter = newValue // Wątek 2 zapisuje 1
}

W tym przykładzie, jeśli oba wątki są wykonywane jednocześnie bez synchronizacji, ostatecznie sharedCounter może stać się 1 zamiast oczekiwanych 2.

Aby zapobiec warunkom wyścigu, stosuje się mechanizmy synchronizacji:

  • Mutex (Mutual Exclusion): Blokuje dostęp do zasobu, pozwalając tylko jednemu wątkowi na dostęp do sekcji krytycznej.
  • Semafory: Ograniczają liczbę wątków mogących jednocześnie uzyskać dostęp do zasobu.
  • Kolejki (Dispatch Queues w GCD): Wykonanie zadań odbywa się kolejno (dla kolejek seryjnych) lub z określonym poziomem paralelizmu (dla kolejek współbieżnych) z możliwością synchronizacji dostępu.
  • Blokady (Locks): Różne typy blokad (np. NSLock, NSRecursiveLock).
  • Operacje atomowe: Gwarantują, że operacja (odczyt, zapis, inkrementacja) jest wykonywana atomowo, tzn. nie może być przerwana przez inny wątek.

W rozwoju iOS często używa się Grand Central Dispatch (GCD) i Operation Queues do zarządzania wątkami i zapobiegania warunkom wyścigu. Kolejki dispatch seriale zapewniają automatyczną synchronizację wykonywanych zadań.