Birden fazla thread aynı veriye aynı anda eriştiğinde programın sonucu her çalıştırmada farklı olabilir. İşte bu belirsiz ve zamana bağlı hata sınıfı race condition olarak adlandırılır.
Bu sorunların zorluğu, bazen nadir görünmeleri ve çoğu zaman üretim ortamında ortaya çıkmalarıdır. Bu nedenle senkronizasyon mantığı modern yazılım geliştirmede temel konulardan biridir.
Kısa cevap: Paylaşılan veriye güvenli erişim sağlamak.
Konu özeti
| Başlık | Özet |
|---|---|
| Odak nokta | Paylaşılan veriye güvenli erişim sağlamak |
| Öğrenilecek yapılar | kritik bölge, lock, veri tutarlılığı ve senkronizasyon |
| En kritik uyarı | Küçük artırma işlemleri bile atomik değildir |
Race condition nasıl oluşur?
Örneğin iki thread aynı sayacı artırıyorsa, bu işlem tek adım gibi görünse de gerçekte okuma, hesaplama ve yazma aşamalarından oluşur. İşte bu adımlar birbirine karıştığında beklenen sonuç bozulur.
Sorun, kodun yanlış görünmesinden değil; aynı kodun farklı zamanlamalarda farklı sonuç üretmesinden kaynaklanır. Bu da hata ayıklamayı zorlaştırır.

Lock neyi çözer?
lock ifadesi, belirli bir kod bloğuna aynı anda yalnızca bir thread’in girmesine izin verir. Böylece kritik bölge korunmuş olur ve paylaşılan verinin tutarlılığı artar.
Amaç tüm uygulamayı tek akışa çevirmek değil, gerçekten korunması gereken küçük ve kritik bölümü güvence altına almaktır.
using System;
using System.Threading;
class Program
{
static int sayac = 0;
static object kilit = new object();
static void Artir()
{
for (int i = 0; i < 10000; i++)
{
lock (kilit)
{
sayac++;
}
}
}
}
Senkronizasyon tasarımı nasıl yapılmalı?
İyi senkronizasyon, olabilecek en küçük kritik bölgeyi korur. Gereğinden büyük lock blokları performansı düşürür; yetersiz koruma ise sorunu çözmez.
Bazı durumlarda lock yeterli olurken, bazı durumlarda concurrent koleksiyonlar veya immutable yapılar daha doğru çözüm sunar. Yani asıl mesele tek bir anahtar kelime değil, doğru tasarım seçimidir.
- Paylaşılan kaynağı açık biçimde tanımlayın.
- Kritik bölgeyi mümkün olduğunca dar tutun.
- Kilit nesnesini yalnızca bu amaç için kullanın.
- Performans ve veri tutarlılığı dengesini birlikte değerlendirin.

Sık yapılan hatalar
- Paylaşılan veriyi korumasız güncellemek
- Gereğinden geniş lock blokları kullanmak
- Farklı amaçlar için aynı lock nesnesine yüklenmek
- Nadiren görülen hataları önemsememek
Sık sorulan sorular
Race condition sadece çok çekirdekli sistemlerde mi olur?
Hayır. Zaman paylaşımlı yürütme nedeniyle tek çekirdekte de ortaya çıkabilir.
Lock her zaman doğru çözüm mü?
Hayır. Bazı durumlarda daha yüksek seviyeli thread-safe yapılar daha iyi sonuç verir.
Neden bazen hata hiç görünmüyor?
Çünkü problem zamanlamaya bağlıdır ve her çalıştırmada aynı sıra oluşmayabilir.
İlgili aramalar
- race condition nedir
- c# lock kullanımı
- paylaşılan veri hataları
- senkronizasyon mantığı
- thread safety nedir
Bir yanıt yazın