Sobes.tech
Middle

Nima bu poyga holati (race condition)?

sobes.tech AI

AIdan javob

Yarış şərti, iki və ya daha çox axın və ya prosesin eyni zamanda ümumi resursa (məsələn, dəyişən, fayl, verilənlər bazası) müraciət etdiyi və əməliyyatın nəticəsinin bu axınların/proseslərin hansı ardıcıllıqla öz fəaliyyətlərini yerinə yetirməsindən asılı olduğu zaman yaranır. Məlumatların giriş və dəyişdirilməsinin qeyri-müəyyən ardıcıllığı səbəbindən, nəticə düzgün və ya gözlənilməz ola bilər.

iOS-də nümunə: Tutaq ki, count sayğacı var və ona eyni zamanda iki axın müraciət edir və onu artırır.

var count = 0

func incrementCount() {
    // Axın 1 count = 5-i oxuyur
    // Axın 2 count = 5-i oxuyur
    let currentCount = count
    // Axın 1 yeni sayını hesablayır = 6
    // Axın 2 yeni sayını hesablayır = 6
    let newCount = currentCount + 1
    // Axın 1 count = 6-yı yazır
    // Axın 2 count = 6-yı yazır (Axın 1-in nəticəsini üst-üstə yazır)
    count = newCount
}

// Əgər iki axın eyni zamanda incrementCount() çağırsa,
// gözlənilən nəticə count = 2 olardı,
// amma yarış şərti səbəbindən, count 1 ola bilər.

Yarış şərtlərini qarşısını almaq üçün sinxronizasiya mexanizmləri istifadə olunur:

  • Lock/Mübarizə: Axın onu istifadə etdiyi zaman resursa girişə mane olur.
    import Foundation
    
    let lock = NSLock()
    var count = 0
    
    func incrementCount() {
        lock.lock() // Lock-i əldə edir
        let currentCount = count
        let newCount = currentCount + 1
        count = newCount
        lock.unlock() // Lock-i azad edir
    }
    
  • Kuyruqlar (Queues): GCD-nin ardıcıl kuyruklarından istifadə.
    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 əməliyyatlar: Prosessorun instruksiya səviyyəsində bölünməz əməliyyatlar. Swift-də OSAtomic... (köhnəlmiş) və ya Atomic (eksperimental) istifadə edilə bilər və ya kilidlər/kuyruqlara əsaslanan yanaşmalar.

Sinxronizasiya metodunun seçimi konkret ssenaridən və performans tələblərindən asılıdır. Anlamaq vacibdir ki, sinxronizasiya əlavə yük gətirə bilər və düzgün həyata keçirilməzsə, qarşılıqlı bloklamalara (deadlock) səbəb ola bilər.