निम्न उदाहरण कोड (paraphrased snippet) देता है:
जबकि (! Head.compare_exchange_weak (New_node- & gt; अगला, new_node, std :: memory_order_release, std :: memory_order_relaxed)); // रिक्त बॉडी
मान लीजिए कि आप इसे थ्रेड ए पर एक बार चलाते हैं, और थ्रेड बी पर एक बार। कुछ भी नहीं head
को छू रहा है या इसके संबंधित डेटा थ्रेड बी की आवाज़ A के होने के बाद शुरू होती है (वास्तविक समय में), लेकिन ए के परिवर्तन अभी CPU चलाने वाले थ्रेड बी के कैश के लिए प्रचारित नहीं हुए हैं।
बी को प्राप्त करने के लिए ए के परिवर्तन क्या हैं? इसका अर्थ यह है कि, निष्पादन जहां बी की कमजोर तुलना करें विनिमय आसानी से अनिश्चित काल में विफल हो जाता है और CPU कैश के बावजूद अभी भी बाध्य नहीं है? या क्या इसकी अनुमति है?
ऐसा लगता है कि सीपीयू चलने वाली बी को ए के द्वारा किए गए परिवर्तनों में बाहर जाने और समन्वयित करने के लिए मजबूर नहीं किया जा रहा है, क्योंकि विफलता स्मृति क्रम सुगम है। तो हार्डवेयर कभी ऐसा क्यों करता है? क्या यह सी ++ कल्पना, या हार्डवेयर की एक गहन गारंटी है, या एक मानक दस्तावेज गारंटी वाली सीमा-स्टेलिनेस की गारंटी है?
अच्छा सवाल! यह वास्तव में विशेष रूप से सी ++ 11 मानक के §1.10 में धारा 25 द्वारा संबोधित है:
एक कार्यान्वयन को यह सुनिश्चित करना चाहिए कि एक परमाणु या सिंक्रनाइज़ेशन ऑपरेशन द्वारा नियत अंतिम मूल्य (संशोधन क्रम में)
तो उत्तर हां है, अंततः दूसरे धागे से प्रचार करने की गारंटी दी जाती है, यहां तक कि आराम मेमोरी क्रम के साथ भी।
No comments:
Post a Comment