Race condition nedir? Bir örnekle nasıl önleneceğini gösterin.
Cevap
Race condition, programın sonucunun thread'lerin çalışma zamanlamasına/sırasına bağlı olmasıdır. Birden fazla thread paylaşılan veriye eşzamanlı erişip en az biri yazıyorsa ve erişim senkronize değilse oluşur.
Klasik örnek
counter += 1 tek bir işlem gibi görünür ama aslında üç adımdır: oku, artır, yaz.
import threading
counter = 0
def worker():
global counter
for _ in range(100_000):
counter += 1 # atomik değil
threads = [threading.Thread(target=worker) for _ in range(4)]
for t in threads: t.start()
for t in threads: t.join()
print(counter) # 400000'den az çıkabilirİki thread aynı anda 5 okur, ikisi de 6 yazar: bir artış kaybolur.
Çözümler
lock = threading.Lock()
def worker():
global counter
for _ in range(100_000):
with lock: # kritik bölge
counter += 1- Kilit (mutex): kritik bölgeyi tek thread'e açar.
- Atomik işlemler:
AtomicInteger, compare-and-swap (CAS). - Paylaşmamak: her thread kendi verisiyle çalışıp sonunda birleştirir; değişmez (immutable) veri.
- Mesajlaşma: veriyi tek bir sahip yönetir, diğerleri kuyruktan istek gönderir (Go channel, actor modeli).
Uygulama seviyesindeki karşılığı
Aynı sorun veritabanında da görülür: iki istek aynı anda stoğu 1 okur, ikisi de satış yapar. Çözüm: UPDATE products SET stock = stock - 1 WHERE id = ? AND stock > 0 gibi atomik sorgu, SELECT ... FOR UPDATE veya versiyon numarasıyla iyimser kilitleme (optimistic locking).
Race condition'lar zamanlamaya bağlı olduğu için nadiren ve tutarsız biçimde ortaya çıkar; test ile yakalanması zordur. Check-then-act (if not exists: create) kalıbı en sık kaynaklardan biridir.
İlgili İşletim Sistemleri soruları
- Concurrency ile parallelism arasındaki fark nedir?
- Context switch nedir? Neden maliyetlidir?
- Virtual memory ve paging nasıl çalışır? Page fault nedir?
- Mutex ile semaphore arasındaki fark nedir?
- Deadlock nedir? Oluşması için gereken dört koşul nelerdir ve nasıl önlenir?
- Process ile thread arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.