Sobes.tech
Middle

Yarış vəziyyəti (race condition) nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Yarış vəziyyəti, 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.