दो धागे के साथ एक कार्यक्रम की कल्पना करो।परमाणु संचालन प्रतिस्पर्धा कर सकते हैं एक दूसरे को भूखा?
// Visible to both threads
static int test;
// Run by thread A
void foo()
{
// Check if value is 'test' and swap in 0xdeadbeef
while(!CAS(&test, test, 0xdeadbeef)) {}
}
// Run by thread B
void bar()
{
while(1) {
// Perpetually atomically write rand() into the test variable
atomic_write(&test, rand());
}
}
क्या यह संभव है के लिए धागा सदा ऐसे विफल कि 0xdeadbeef 'परीक्षण' के लिए कभी नहीं लिखा है धागा एक के कैस पैदा करने के लिए: वे निम्नलिखित कोड (कैस Compare and Swap को संदर्भित करता है) चल रहे हैं? या प्राकृतिक शेड्यूलिंग जिटर का मतलब है कि व्यवहार में यह कभी नहीं होता है? क्या होगा अगर धागा ए के दौरान कुछ काम किया गया था?
यह केवल दो बार निष्पादित क्यों होगा? यदि यह परीक्षण की पहुंच को दूर करता है, तो यह प्रभाव नहीं है कि यह लूप * हमेशा * हो सकता है? तुलना और स्वैप हमेशा असफल रहेगा क्योंकि तुलना हमेशा गलत होगी, जब तक कि आप भाग्यशाली नहीं होते हैं और रैंड() उस मान को वापस लौटाता है जो परीक्षण थ्रेड से पहले होता है ए लूप में प्रवेश करता है और थ्रेड ए सही समय पर चलने वाला होता है। –
जब भी आप अविश्वसनीय रूप से असंभव कहते हैं, तो क्या आपका मतलब यह नहीं है कि आप उत्पादन कोड में इस कोड का उपयोग करने का विरोध नहीं करेंगे? एक सरल संभावना की गणना करने की कोशिश करना दिलचस्प होगा। –
जब मैं थ्रेडिंग मुद्दे का जिक्र करते समय व्यक्तिगत रूप से अविश्वसनीय रूप से असंभव कहता हूं, मेरा मतलब है कि मैं इसे ठीक करना चाहता हूं इसलिए यह वास्तव में नहीं होता है। मेरे पास बहुत अधिक "ऐसा नहीं होने वाला" मुझ पर उड़ा है। –