Asenkron ve paralel dünyada hız her şey değildir. Eğer birden fazla thread aynı anda aynı veriyi değiştirmeye çalışırsa, ortaya çıkan kaosa Race Condition (Yarış Durumu) diyoruz.
Şimdi bir geliştirici, kilit (lock) mekanizmalarını doğru kullanarak bu kaosu nasıl yönetir onu inceleyelim.
1. Paylaşılan Durum (Shared State) Tehdidi
Bir değişkenin üzerine aynı anda yazma işlemi yapıldığında, işlemci seviyesindeki okuma-artırma-yazma döngüsü bozulur.
// TEHLİKELİ KOD: Race Condition örneği
int counter = 0;
Parallel.For(0, 1000, i => {
counter++; // Bu işlem 'atomic' değildir!
});
// Sonuç her zaman 1000 çıkmayacaktır.2. Lock Mekanizması ve Monitor
En klasik çözüm lock anahtar kelimesidir. Ancak lock kullanırken dikkat edilmesi gereken kural: Asenkron metodların içinde lock kullanamazsınız. Çünkü lock, thread-bound bir yapıdır ve await sonrası thread değişebilir.
Çözüm:
SemaphoreSlim(1, 1)kullanarak asenkron beklemeye uygun kilitler oluşturun.
3. Interlocked: Hafif ve Hızlı
Basit sayısal işlemler (artırma, toplama, değiştirme) için ağır kilitler yerine CPU seviyesinde atomik işlem yapan Interlocked sınıfını tercih etmelisiniz.
Interlocked.Increment(ref counter); // Güvenli ve lock'tan çok daha hızlı.4. Thread-Safe Koleksiyonlar
List<T> veya Dictionary<K,V> thread-safe değildir. Paralel işlemler yaparken System.Collections.Concurrent altındaki ConcurrentDictionary,ConcurrentQueue, ConcurrentBag gibi yapıları kullanmak, manuel lock yönetiminden sizi kurtarır.
