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.