Middle
iOS uygulamalarında iş parçacıklarının güvenliğini sağlamak için hangi yöntemler vardır?
sobes.tech yapay zeka
AI'dan gelen yanıt
iOS'ta iş parçacığı güvenliğini sağlamak için aşağıdaki temel mekanizmalar kullanılır:
-
Mutex (karşılıklı dışlama):
pthread_mutex_t: POSIX'ten düşük seviyeli C API.NSLock: Lock primitive'leri üzerine nesne yönelimli sarmalayıcı, Foundation'ın bir parçası.NSRecursiveLock: Aynı iş parçacığı tarafından yinelenen kilitlenmeye izin verir.
import Foundation let lock = NSLock() var paylaşılanKaynak = 0 func paylaşılanKaynağıDeğiştir() { lock.lock() // Kritik bölüm paylaşılanKaynak += 1 lock.unlock() } -
Spin Lock:
OSSpinLock: eski ve önermeyen, öncelik sorunları ve uzun beklemede CPU tüketimi nedeniyle.os_unfair_lockile değiştirilmiştir.os_unfair_lock:OSSpinLock'in daha verimli alternatifi, os.xnu'nun bir parçası.
import os.lock var unfairLock = os_unfair_lock() var başkaBirKaynak = 0 func kaynağıGüncelle() { os_unfair_lock_lock(&unfairLock) // Kritik bölüm başkaBirKaynak += 1 os_unfair_lock_unlock(&unfairLock) } -
Semafor:
DispatchSemaphore: Grand Central Dispatch (GCD) semaforu. Bir sayıcı aracılığıyla kaynağa erişimi kontrol eder.
import Foundation let semaphore = DispatchSemaphore(value: 1) // Sayıcı = 1 (mutex'e eşdeğer) var sınırlıKaynak = 0 func sınırlıKaynağaErişim() { semaphore.wait() // Sayacı azaltır, 0 veya daha azsa bloklar // Kritik bölüm sınırlıKaynak += 1 semaphore.signal() // Sayacı artırır } -
Eşzamanlı Kuyruk ve Barrier Görevleri:
- GCD'de eşzamanlı kuyruk kullanımı (concurrent queue) okuma ve yazma için. Okuma paralel (
async), yazma ise münhasır (sync(flags: .barrier)).
import Foundation let eşzamanlıKuyruk = DispatchQueue(label: "com.ornek.eşzamanlıKuyruk", attributes: .concurrent) var korumalıDizi: [Int] = [] func öğeEkle(_ öğe: Int) { eşzamanlıKuyruk.sync(flags: .barrier) { // .barrier bayrağı ile görev, münhasır olarak çalışır korumalıDizi.append(öğe) } } func diziyiOku() -> [Int] { var diziKopyası: [Int] = [] eşzamanlıKuyruk.sync { // Normal senkron görev (okuma), diğer okumalara paralel olabilir diziKopyası = korumalıDizi } return diziKopyası } - GCD'de eşzamanlı kuyruk kullanımı (concurrent queue) okuma ve yazma için. Okuma paralel (
-
Atomik İşlemler:
- Düşük seviyeli işlemler, atomiklik garantisi sağlar (tek parça olarak, kesintisiz çalışır). Basit veri tipleri (tam sayılar, işaretçiler) için kullanılır.
import Darwin // Bazı atomik fonksiyonlar için, örneğin OSAtomic... var atomikSayaç: Int32 = 0 func atomikSayaçArtır() -> Int32 { // Atomik işlem örneği return OSAtomicIncrement32(&atomikSayaç) }- Swift'te
Atomic<Value>gibi deneme amaçlı tiplerswift-atomicsiçinde mevcuttur.
-
İş Parçacığı Temizleyicisi (Thread Sanitizer):
- Uygulama çalışırken veri yarışlarını tespit eden hata ayıklama aracı. Xcode derleme şemasında etkinleştirilir (Edit Scheme -> Run -> Diagnostics -> Thread Sanitizer).
Mekanizmanın seçimi göreve bağlıdır:
- Basit münhasır erişim:
NSLock,DispatchSemaphore(value: 1),os_unfair_lock. - Yinelenen kilit:
NSRecursiveLock. - Okuma/yazma:
.barrierile eşzamanlı kuyruk. - Erişim kısıtlaması (kaynak havuzu):
DispatchSemaphore(sayacı > 1 ile). - Basit sayaçlar/ bayraklar: Atomik işlemler (uygunsa ve maksimum performans gerekiyorsa, dikkatli olunmalı).
Kaçınılması gerekenler:
OSSpinLock.- Gereksiz küresel kilitlerin kullanımı.
- Düşük seviyeli primitive'lerle erken optimizasyon, bunların nasıl çalıştığını anlamadan.