Concurrent programming, uygulamalarda performans artışı sağlamak adına çoklu iş parçacığı (thread) kullanımını içerir. Ancak, bu paralel çalışma ortamında dikkat edilmesi gereken önemli bir hata türü vardır: data race (veri yarışı).
1. Data Race Nedir?
Data race, aynı veriye birden fazla iş parçacığının aynı anda eşzamanlı erişim sağlamaya çalıştığı bir hata türüdür. Bu durum, öngörülemez davranışlara, tutarsız sonuçlara ve hatta uygulamanın çökmesine neden olabilir. Data race durumları genellikle iki veya daha fazla iş parçacığının bir değişkeni okuma ve yazma işlemlerini gerçekleştirmesiyle ortaya çıkar.
Apple Developer’ın bu konu hakkındaki yazısına ulaşmak için tıklayın.
2. Concurrent Programming’de Data Race Örneği
Önceki Swift sürümlerinde, DispatchQueue
kullanılarak thread-safe kod yazma çabalarımız olabilir. Ancak, bu durum bazen karmaşık ve hata eğilimli olabilir. Örnek bir data race senaryosu:
var sharedValue = 0
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
concurrentQueue.async {
sharedValue += 1 // İş Parçacığı 1
}
concurrentQueue.async {
sharedValue += 1 // İş Parçacığı 2
}
// Bekleme süresi ekleyerek işlemlerin tamamlanmasını sağlamak
sleep(2)
print("Sonuç: \(sharedValue)") // Beklenmeyen sonuçlar alınabilir
3. Data Race’den Korunmak İçin
Swift 5.5 ve sonrasında gelen actor
yapısı, data race durumlarından korunmak için etkili bir araçtır. Actor
kullanarak data race’den korunmanın örnek bir şekli:
actor SafeCounter {
private var value = 0
func increment() {
value += 1
}
func getValue() -> Int {
return value
}
}
let counter = SafeCounter()
Task {
await counter.increment()
print(await counter.getValue()) // Erişim otomatik olarak yönetilir
}
actor
yapısı, verilere otomatik olarak thread-safe erişim sağlar ve geliştiricilerin ekstra önlemler almasına gerek kalmaz.
Data race durumları, concurrent programming süreçlerinde karşılaşılabilecek riskli hatalardan biridir. Swift dilinde,
actor
yapısı gibi modern ve güçlü araçlar kullanarak bu hatalardan korunabiliriz.