Sobes.tech
Middle

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ış) veya Atomic (@_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.