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