Ana içeriğe geç

Race Condition

Yarış Durumu

Türkçe karşılığı
yarış koşulu
Okunuşu
reys kındişın

Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/race-condition

Kısaca

Race condition, programın sonucunun paylaşılan veriyi aynı anda kullanan thread, process veya isteklerin öngörülemeyen zamanlamasına bağlı olduğu hatadır.

Race condition (yarış durumu) nedir?

Race condition, iki ya da daha fazla işlem eşzamanlı çalıştığında, aynı veriye veya kaynağa dokunduğunda ve en az biri onu değiştirdiğinde ortaya çıkar; sonuç hangisinin önce çalıştığına bağlıdır. Zamanlama çalıştırmadan çalıştırmaya değiştiği için program binlerce kez doğru çalışıp sonra bir kez başarısız olabilir; bu da race condition'ları yeniden üretilmesi en zor hatalardan biri yapar.

Klasik örnek, aslında üç adım olan counter += 1'dir: değeri oku, bir ekle ve geri yaz. İki thread de 5'i okursa ikisi de 6 yazar ve bir artırma kaybolur. Bir diğer yaygın örüntü, bir dosyanın var olmadığını kontrol edip sonra oluşturmak gibi kontrol et-sonra-uygula (check-then-act) biçimindedir; bu sırada başka bir process araya girip onu oluşturabilir. Buna time-of-check to time-of-use (TOCTOU) denir ve aynı zamanda iyi bilinen bir güvenlik açığı sınıfıdır. Yarışlar thread'lerle sınırlı değildir: son konser biletini alan iki web isteği veya aynı dosyaya yazan iki process de yarışabilir.

Bir banka hesabını paylaşan ve 100 dolarlık bakiyeyi aynı anda iki ATM'de kontrol eden iki kişiyi düşünün. İkisi de yeterli para görür, ikisi de 80 dolar çeker ve koordinasyon olmadan banka ikisine de izin verir. Çözümler arasında mutex'ler ve diğer kilitler, atomik işlemler, uygun bir yalıtım düzeyine ya da iyimser kilitlemeye sahip veritabanı transaction'ları ve değişmez veri veya mesaj geçişi gibi paylaşılan değiştirilebilir durumdan kaçınan tasarımlar vardır. Thread sanitizer'lar ve Go'nun race detector'ı gibi araçlar testler sırasında yarışları bulmaya yardımcı olur.

Race condition'lar çoğu zaman deadlock'larla karıştırılır. Race condition'da program çalışmaya devam eder ama yanlış sonuçlar üretir; deadlock'ta ise ilerlemeyi durdurur. İkisi bağlantılıdır; çünkü bir yarışı düzeltmek için kilit eklemek, kilitler tutarsız sırayla alınırsa deadlock yaratabilir. Mutex'ler ve semaphore'lar araçlardır; race condition ise onların önlediği hatadır.

Bir bakışta

İki thread de herhangi biri yazmadan önce counter = 5 değerini okur, ikisi de 5 + 1 hesaplar ve ikisi de 6 yazar; böylece sayaç 7 yerine 6'da kalır.Thread 1counterThread 215'i okur25'i okur36 yazar46 yazar5 + 15 + 1counter = 6beklenen: 7
Okumak, bir eklemek ve geri yazmak üç ayrı adımdır. İki thread bunları iç içe geçirince bir artırma kaybolur.

Önemli noktalar

  • Race condition, sonucu eşzamanlı işlemlerin zamanlamasına bağımlı kılar.
  • Oku-değiştir-yaz ve kontrol et-sonra-uygula dizileri en yaygın nedenlerdir.
  • Yarışlar thread'ler, process'ler veya ayrı web istekleri arasında olabilir.
  • Kilitler, atomik işlemler ve transaction'lar olağan çözümlerdir.
  • Yarış yanlış sonuç verir; deadlock ise ilerlemeyi tamamen durdurur.

Örnek

JavaScript'te iki asenkron istek arasındaki yarışjavascript
// Two requests try to buy the last ticket at the same time
async function buyTicket(userId) {
  const event = await db.getEvent(1);  // both requests read seatsLeft = 1
  if (event.seatsLeft > 0) {           // both pass the check...
    await db.createOrder(userId);
    await db.updateEvent(1, { seatsLeft: event.seatsLeft - 1 });
  }
}
await Promise.all([buyTicket("ada"), buyTicket("linus")]); // 2 orders, 1 seat

// Fix: make the check and the update one atomic step in the database:
// UPDATE events SET seats_left = seats_left - 1
//   WHERE id = 1 AND seats_left > 0
// ...and create the order only if exactly one row was updated.

Sık sorulan sorular

Race condition ile deadlock arasındaki fark nedir?

Race condition programın çalışmaya devam etmesine izin verir ancak veriyi bozabilir ya da yanlış sonuçlar üretebilir. Deadlock ise her biri başkasının tuttuğu bir kaynağı beklediği için ilgili thread'leri dondurur.

Tek thread'li JavaScript'te race condition olabilir mi?

Evet. Kod tek bir thread'de hiçbir zaman paralel çalışmaz, ancak her await arada başka görevlerin çalışmasına izin verir; bu yüzden iki asenkron işlem paylaşılan veri ya da harici bir veritabanı etrafında yine de iç içe geçebilir.

Data race ile race condition arasındaki fark nedir?

Data race belirli, alt düzey bir durumdur: iki thread senkronizasyon olmadan aynı belleğe aynı anda erişir ve en az biri yazar. Race condition ise zamanlamaya bağlı sonuçların daha geniş sorunudur ve her tekil erişim düzgün senkronize edilmiş olsa bile var olabilir.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar