Sobes.tech
Middle

Co robi synchronizacja w kontekście wielowątkowości?

sobes.tech AI

Odpowiedź od AI

Synchronizacja w kontekście wielowątkowości zapobiega warunkom wyścigu (race condition) i zapewnia spójny dostęp do współdzielonych zasobów (zmiennych, plików, połączeń sieciowych) z różnych wątków.

Główne mechanizmy synchronizacji:

  • Mutex (mutual exclusion): Tylko jeden wątek może posiadać mutex i uzyskać dostęp do chronionego zasobu.
  • Semaphore (semafor): Ogranicza liczbę wątków, które mogą jednocześnie uzyskać dostęp do zasobu. Działa z licznikiem.
  • Lock (blokada): Uogólnione pojęcie, często używane do oznaczania mutexów lub innych mechanizmów, które całkowicie blokują dostęp.
  • Dispatch Queue (kolejka dyspozycji): W Grand Central Dispatch (GCD) kolejki mogą być sekwencyjne (serial) lub równoległe (concurrent), zapewniając synchronizację poprzez kontrolę kolejności i liczby wykonywanych jednocześnie zadań. Kolejki sekwencyjne gwarantują wykonanie zadań po kolei, co inherentnie zapewnia synchronizację dla danych dostępnych tylko z zadań tej kolejki.

Zasada działania: Wątek, który chce uzyskać dostęp do wspólnego zasobu, najpierw próbuje uzyskać blokadę (lock). Jeśli zasób jest wolny, wątek uzyskuje blokadę i pracuje z zasobem. Po zakończeniu zwalnia blokadę (release lock). Jeśli zasób jest zajęty, inne wątki są blokowane (czekają), aż zasób zostanie zwolniony.

Przykład użycia mutex do ochrony sekcji krytycznej:

// Przykład w Objective-C z użyciem @synchronized
- (void)updateSharedResource {
    @synchronized (self) { // Blokada na obiekcie self
        // Tutaj wykonywana jest sekcja krytyczna
        // Dostęp do sharedResource jest bezpieczny
        self.sharedResource++;
    } // Blokada jest automatycznie zwalniana po wyjściu z bloku
}
// Przykład w Swift z użyciem NSLock
let lock = NSLock()
var sharedCounter = 0

func incrementCounter() {
    lock.lock() // Próba uzyskania blokady
    // Sekcja krytyczna
    sharedCounter += 1
    lock.unlock() // Zwolnienie blokady
}

Synchronizacja pozwala uniknąć problemów takich jak:

  • Uszkodzenie danych.
  • Deadlock (zakleszczenie) wątków.
  • Livelock (aktywny zakleszczenie) wątków.

Wybór odpowiedniego mechanizmu synchronizacji zależy od charakteru zadania i typu zasobu.