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ə yaAtomic(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.