Yarış koşulları ve veri yarışları arasında önemli bir teknik fark vardır. Çoğu cevap, bu terimlerin eşdeğer olduğu varsayımına sahip gibi görünmektedir, ancak değildir.
Bir veri yarışı, 2 komut aynı bellek konumuna eriştiğinde gerçekleşir, bu erişimlerden en az biri bir yazma işlemidir ve bu erişimler arasında sipariş vermeden önce gerçekleşmez . Şimdi, sipariş vermeden önce bir şey oluşturan şey çok tartışmaya tabidir, ancak genel olarak aynı kilit değişkenindeki ulock-kilit çiftleri ve aynı koşul değişkenindeki bekleme sinyali çiftleri, bir önce-sipariş düzenini başlatır.
Bir yarış koşulu anlamsal bir hatadır. Hatalı program davranışına yol açan olayların zamanlamasında veya sıralamasında ortaya çıkan bir kusurdur .
Birçok yarış koşulu veri yarışlarından kaynaklanabilir (ve aslında buna neden olabilir), ancak bu gerekli değildir. Nitekim, veri yarışları ve ırk koşulları ne gerekli ne de birbiri için yeterli koşul. Bu blog yazısı aynı zamanda basit bir banka işlem örneği ile farkı çok iyi açıklamaktadır. İşte farkı açıklayan başka bir basit örnek .
Şimdi terminolojiyi çivilediğimize göre, orijinal soruyu cevaplamaya çalışalım.
Yarış koşullarının semantik hatalar olduğu göz önüne alındığında, bunları tespit etmenin genel bir yolu yoktur. Bunun nedeni, genel durumda doğru ve yanlış program davranışını ayırt edebilecek otomatik bir kehanete sahip olmanın hiçbir yolu olmamasıdır. Yarış tespiti kararlaştırılamaz bir sorundur.
Öte yandan, veri yarışları, doğrulukla ilgili olması gerekmeyen kesin bir tanıma sahiptir ve bu nedenle bunları algılayabilir. Veri yarışı dedektörlerinin birçok çeşidi vardır (statik / dinamik veri yarışı algılama, lockset tabanlı veri yarışı algılama, önce gerçekleşen veri yarışı algılama, hibrit veri yarışı algılama). Son teknoloji ürünü dinamik veri yarış dedektörü, pratikte çok iyi çalışan ThreadSanitizer'dir .
Genel olarak veri yarışlarını yönetmek, paylaşılan verilere erişim arasında (geliştirme sırasında ya da yukarıda belirtilen araçlar kullanılarak tespit edildikten sonra) kenarlar oluşmadan önce bazı programlama disiplinlerini gerektirir. bu, kilitler, durum değişkenleri, semaforlar, vb. yoluyla yapılabilir. Ancak, inşaat yoluyla veri yarışlarını önleyen mesaj geçirme (paylaşılan bellek yerine) gibi farklı programlama paradigmaları da kullanılabilir.