Yarış şərti nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Yarış vəziyyəti çox ipli və ya çox prosesli tətbiqdə ortaya çıxan bir problemdir və nəticənin düzgünlüyü iplərin/proseslərin icra sırasına bağlıdır.
Əsasən, bir neçə ipin eyni zamanda ümumi resurslara (dəyişənlər, fayllar, verilənlər bazaları) düzgün sinxronizasiya olmadan giriş etməsi zamanı baş verir.
Bu, gözlənilməz davranışlara, səhvlərə və düzgün olmayan məlumatlara səbəb olur.
Nümunə: İki ip eyni zamanda ümumi dəyişəni artırmağa çalışır.
var sharedCounter = 0
func incrementCounter() {
let currentValue = sharedCounter // İp 1 0 oxuyur
// Bir gecikmə
let newValue = currentValue + 1 // İp 1 1 hesablayır
sharedCounter = newValue // İp 1 1 yazır
}
// Əgər İp 2 currentValue-ni oxuyursa, İp 1 newValue-ni yazmadan əvvəl:
func anotherIncrementCounter() {
let currentValue = sharedCounter // İp 2 0 oxuyur
let newValue = currentValue + 1 // İp 2 1 hesablayır
sharedCounter = newValue // İp 2 1 yazır
}
Bu nümunədə, əgər hər iki ip eyni vaxtda sinxronizasiyasız işləsə, nəticədə sharedCounter 2 əvəzinə 1 ola bilər.
Yarış vəziyyətlərinin qarşısını almaq üçün sinxronizasiya mexanizmləri istifadə olunur:
- Mutex (Mutual Exclusion): Resursa girişə mane olur, yalnız bir ip kritik bölmədə ola bilər.
- Semaforlar: Resursa eyni vaxtda giriş edə biləcək iplərin sayını məhdudlaşdırır.
- Dispatch Queues (GCD-də): Tapşırıqlar ardıcıl (Serial Queue üçün) və ya müəyyən paralellik səviyyəsi ilə (Concurrent Queue üçün) icra olunur və giriş sinxronlaşdırıla bilər.
- Locks: Müxtəlif lock növləri (
NSLock,NSRecursiveLockvə s.). - Atomik əməliyyatlar: Əməliyyatların (oxuma, yazma, artırma) atomar şəkildə yerinə yetirilməsini təmin edir, yəni başqa bir ip tərəfindən kəsilməz.
iOS inkişafında, çox vaxt, ipləri idarə etmək və yarış vəziyyətlərinin qarşısını almaq üçün Grand Central Dispatch (GCD) və Operation Queues istifadə olunur. Serial Dispatch Queues avtomatik olaraq bu kuyrukda yerinə yetirilən tapşırıqları sinxronlaşdırır.