Data Race — ikki yoki undan ortiq concurrent execution bir xil xotira joyiga synchronization bilan tartiblanmagan holda murojaat qilib, kamida bittasi yozuv bo‘lgan holat.
Formal shart
Formal memory modelda conflicting accesslar orasida happens-before aloqasi bo‘lmasa race yuz beradi. Lock, atomic acquire/release, thread start/join yoki til belgilagan synchronization bu aloqani yaratishi mumkin.
Race condition farqi
Race condition kengroq tushuncha: natija timingga bog‘liq bo‘lishi mumkin, lekin barcha access atomic va data race’siz ham logical race yuz beradi. Data race ayrim tillarda undefined behavior, boshqalarida belgilangan zaif natijaga ega.
Oddiy misol
counter++ read-modify-write bo‘lib, oddiy integer atomic emas. Ikki thread update yo‘qotishi mumkin. Mutex, atomic fetch-add yoki ownership orqali tuzatiladi. volatile ko‘p tillarda thread synchronization bermaydi.
Aniqlash
Race detector accesslarni instrument qilib vector clock yoki epoch bilan happens-beforeni kuzatadi. U faqat bajarilgan yo‘llarni ko‘radi va timing overhead keltiradi. Static analyzer ko‘proq yo‘lni ko‘radi, lekin false positive beradi.
Publication
Benign deb taxmin qilingan race compiler va CPU reorder sabab kelajakda buzilishi mumkin. Double-checked locking to‘g‘ri publication va memory ordering talab qiladi. Immutable obyekt publicationdan keyin osonroq share qilinadi.
Sinov
Test stress va randomized scheduler bilan birga race detectorda bajariladi. Assertion final qiymat bilan cheklanmay, synchronization protocol va ownership invariantini tekshiradi.
Amaliy boshqaruv
Data Race implementatsiyasida conflicting access va happens-before alohida va versiyalangan holat sifatida yuritiladi. Qaror uchun zarur inputlar yashirin global taxminga aylantirilmaydi: platforma, konfiguratsiya, identity yoki memory-order sharti tegishli obyekt bilan bog‘lanadi. Shu sabab incremental yangilanish, context almashishi yoki parallel hodisada eskirgan ma’lumotdan foydalanish kamayadi. Debug rejim qarorni hosil qilgan edge, state transition va parametrlarni ko‘rsatadi; production log esa maxfiy qiymatlarni xom shaklda yozmaydi.
Muhim xato sinfi — synchronizationsiz write/read. Bunday vaziyatda tizim optimistik tarzda davom etmaydi: semantikaga qarab konservativ fallback, bounded retry, taskni bloklash yoki aniq error tanlanadi. Timeout correctness isboti emas; u faqat operatsion limitdir. Queue membership, reference count, lock ownership va visibility kabi invariantlar state bilan atomik yangilanadi. Cancellation yoki failure o‘rtada yuz bersa qisman o‘zgargan holat cleanup protokoli orqali tiklanadi.
Sifat nazorati race detector va randomized scheduler orqali bajariladi. Test normal yo‘ldan tashqari bo‘sh navbat, bitta element, yuqori contention, timeout bilan bir vaqtdagi wakeup, resurs limiti va platforma variantlarini qamraydi. To‘g‘rilik performance’dan alohida tekshiriladi; keyin throughput, p99 latency, context switch, cache miss yoki artefakt hajmi kabi mavzuga mos ko‘rsatkichlar baseline bilan solishtiriladi. Topilgan minimal interleaving yoki kirish regressiya to‘plamida doimiy saqlanadi.
Data-race-free kafolat ko‘plab memory modellarda sequentially consistentga yaqin reasoning beradi. Race mavjud bo‘lsa sanitizer reportdagi ikki stack, thread creation va lockset muammoni ko‘rsatadi. Birinchi reportdan keyingi xatolar kaskad bo‘lishi mumkin, shuning uchun minimal reproducer bitta conflictga qisqartiriladi.
Bog‘liq tushunchalar
concurrency, happens-before, atomic operation, mutex, race detector, memory model