Yarış durumu (race condition) nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Yarış durumu, iki veya daha fazla akışın veya işlemin aynı anda ortak bir kaynağa (örneğin, bir değişken, dosya, veritabanı) eriştiği ve işlemin sonucunun bu akışların/proseslerin hangi sırayla gerçekleştirdiğine bağlı olduğu durumdur. Veri erişimi ve değiştirilmesinin tahmin edilemeyen sırası nedeniyle, sonuç hatalı veya beklenmedik olabilir.
iOS'ta örnek:
Diyelim ki, aynı anda iki akışın eriştiği bir count sayacı var ve bu sayacı artırıyorlar.
var count = 0
func incrementCount() {
// Akış 1 count = 5'i okur
// Akış 2 count = 5'i okur
let currentCount = count
// Akış 1 yeni sayıyı hesaplar = 6
// Akış 2 yeni sayıyı hesaplar = 6
let newCount = currentCount + 1
// Akış 1 count = 6'yı yazar
// Akış 2 count = 6'yı yazar (Akış 1'in sonucunu üzerine yazar)
count = newCount
}
// Eğer iki akış aynı anda incrementCount() çağırırsa,
// beklenen sonuç count = 2 olur,
// ancak yarış durumu nedeniyle count 1 olabilir.
Yarış durumlarını önlemek için senkronizasyon mekanizmaları kullanılır:
- Lock/Mücadele: Kaynağa erişimi, akış kullanırken engeller.
import Foundation let lock = NSLock() var count = 0 func incrementCount() { lock.lock() // Kilidi al let currentCount = count let newCount = currentCount + 1 count = newCount lock.unlock() // Kilidi bırak } - Kuyruklar (Queues): GCD'nin sıralı kuyruklarının kullanımı.
import Foundation let serialQueue = DispatchQueue(label: "com.myapp.counterQueue") var count = 0 func incrementCount() { serialQueue.async { let currentCount = count let newCount = currentCount + 1 count = newCount } } - Atomik işlemler: İşlem seviyesinde bölünmez işlemler. Swift'te
OSAtomic...(kullanımdan kaldırılmış) veyaAtomic(@_implementationOnly import Atomics ile) kullanılabilir veya kilitler/kuyruklar temel alınabilir.
Senkronizasyon yöntemi, belirli senaryoya ve performans gereksinimlerine bağlıdır. Senkronizasyonun ek yük getirebileceğini ve yanlış uygulanırsa karşılıklı kilitlenmelere (deadlock) yol açabileceğini anlamak önemlidir.