Yarış durumu nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Yarış durumu, çok iş parçacıklı veya çok işlemli bir uygulamada ortaya çıkan ve sonucun doğruluğunun iş parçacıkları/proseslerin yürütülme sırasına bağlı olduğu bir sorundur.
Genellikle, birkaç iş parçacığının uygun senkronizasyon olmadan ortak kaynaklara (değişkenler, dosyalar, veritabanları) aynı anda erişmesiyle ortaya çıkar.
Bu, öngörülemeyen davranışlara, hatalara ve yanlış verilere yol açar.
Örnek: İki iş parçacığı aynı anda ortak bir değişkeni artırmaya çalışıyor.
var sharedCounter = 0
func incrementCounter() {
let currentValue = sharedCounter // İş parçacığı 1 0 okur
// Bir gecikme
let newValue = currentValue + 1 // İş parçacığı 1 1 hesaplar
sharedCounter = newValue // İş parçacığı 1 1 yazar
}
// İş parçacığı 2, iş parçacığı 1 yeni değeri yazmadan önce currentValue'yu okursa:
func anotherIncrementCounter() {
let currentValue = sharedCounter // İş parçacığı 2 0 okur
let newValue = currentValue + 1 // İş parçacığı 2 1 hesaplar
sharedCounter = newValue // İş parçacığı 2 1 yazar
}
Bu örnekte, iki iş parçacığı da senkronizasyon olmadan aynı anda çalıştırılırsa, sonunda sharedCounter 2 yerine 1 olabilir.
Yarış koşullarını önlemek için senkronizasyon mekanizmaları kullanılır:
- Mutex (Karşılıklı dışlama): Kaynağa erişimi engeller, sadece bir iş parçacığının kritik bölümde olmasına izin verir.
- Semaforlar: Aynı anda bir kaynağa erişebilecek iş parçacığı sayısını sınırlar.
- Görev Kuyrukları (GCD'deki Dispatch Queues): Görevlerin yürütülmesi sıralı (Sıralı Kuyruklar için) veya belirli bir paralellik seviyesiyle (Eşzamanlı Kuyruklar için) gerçekleşir ve erişim senkronize edilebilir.
- Kilitler (Locks): Çeşitli kilit türleri (örneğin,
NSLock,NSRecursiveLock). - Atomik İşlemler: İşlemin (okuma, yazma, artırma) atomik olarak gerçekleştirilmesini sağlar, yani başka bir iş parçacığı tarafından kesintiye uğramaz.
iOS geliştirmede, iş parçacıklarını yönetmek ve yarış koşullarını önlemek için sık sık Grand Central Dispatch (GCD) ve Operation Queues kullanılır. Seri Dispatch Queue'lar, bu kuyruğa yapılan görevlerin otomatik senkronizasyonunu sağlar.