Sobes.tech
Middle

Çok iş parçacıklı geliştirme bağlamında data race'in ne olduğunu açıklayın.

sobes.tech yapay zeka

AI'dan gelen yanıt

Veri yarışı, birden fazla akışın veya işlemin aynı bellek alanına (değişken, nesne) eşzamanlı olarak eriştiği ve en az birinin erişim sırasında yazma yaptığı, herhangi bir erişim senkronizasyonu olmadan gerçekleşen bir durumdur.

Veri yarışı sonuçları öngörülemez ve şunları içerebilir:

  • Değişkenlerin yanlış değerleri.
  • Uygulama çökmeleri.
  • Diğer zor tespit edilen hatalar.

Swift'te veri yarışı örneği:

// Korunmamış sayaç
var counter = 0

// Bir akışta sayacı artıran fonksiyon
func incrementCounter() {
    for _ in 0..<1000 {
        counter += 1 // Burada veri yarışı gerçekleşir
    }
}

// Birden fazla akış oluşturma ve başlatma
let queue = DispatchQueue.global()
queue.async {
    incrementCounter()
}

queue.async {
    incrementCounter()
}

// Sonuç olarak, counter 2000 olmayabilir

Veri yarışını önlemenin yolları:

  • Kilitlemeler (Locks): NSLock, os_unfair_lock.
  • Mutexler: pthread_mutex ile kullanılır.
  • Semaforlar: DispatchSemaphore.
  • Kuyruklar ve bariyerler: DispatchQueue(label: "myQueue", attributes: .concurrent) ve .barrier bayrağı ile yazma sırasında.
  • Senkronize (Objective-C): @synchronized.
  • Atomik işlemler: AtomicBool gibi atomik türlerin kullanımı.
  • Eşzamanlı erişime güvenli veri yapıları: Örneğin, NSCache veya özel kütüphaneler.