एक कोडबेस में COMPILER_BARRIER
मैक्रो __asm__ volatile("" ::: "memory")
के रूप में परिभाषित किया गया है। मैक्रो का इरादा संकलक को फिर से ऑर्डर करने से रोकता है और बाधा में लिखता है। ध्यान दें कि यह स्पष्ट रूप से एक कंपाइलर बाधा है, और प्रोसेसर स्तर मेमोरी बाधा नहीं है।`+` __asm__ अस्थिर ("" ::: "स्मृति" के बराबर सी ++ 11 परमाणु एपीआई क्या है `` `
जैसा कि, यह काफी पोर्टेबल है क्योंकि असेंबलर टेम्पलेट में कोई वास्तविक असेंबली निर्देश नहीं हैं, केवल volatile
और memory
क्लॉबर। इसलिए, जब तक संकलक जीसीसी के विस्तारित एएसएम वाक्यविन्यास का सम्मान करता है, तो इसे ठीक काम करना चाहिए। फिर भी, मैं उत्सुक हूं कि इसे व्यक्त करने का सही तरीका सी ++ 11 परमाणु एपीआई में होगा, यदि संभव हो तो।
निम्नलिखित प्रतीत होता है कि यह सही विचार हो सकता है: atomic_signal_fence(memory_order_acq_rel);
।
मेरे जा रहा है कि तर्क:
- , केवल
atomic_signal_fence
औरatomic_thread_fence
संचालित करने के लिए जो के खिलाफ एक स्मृति पते जरूरत नहीं है। atomic_thread_fence
मेमोरी ऑर्डरिंग को प्रभावित करता है, जिसे हमें कंपाइलर बाधा की आवश्यकता नहीं होती है।memory
विस्तारित एएसएम संस्करण में क्लॉबर पढ़ने और लिखने के बीच अंतर नहीं करता है, इसलिए ऐसा लगता है कि हम दोनों अर्थशास्त्र प्राप्त करना और रिलीज करना चाहते हैं, इसलिएmemory_order_acq_rel
न्यूनतम रूप से आवश्यक है।memory_order_seq_cst
अनावश्यक लगता है, क्योंकि हमें धागे के कुल क्रम की आवश्यकता नहीं है - हम केवल वर्तमान धागे के भीतर अनुक्रम अनुक्रम में रूचि रखते हैं।
<atomic>
एपीआई के
यह __asm__ volatile("" ::: "memory")
पूरी तरह portably सी ++ 11 एटोमिक्स एपीआई के साथ के बराबर व्यक्त करने के लिए संभव है? यदि हां, तो atomic_signal_fence
उपयोग करने के लिए सही API है? यदि हां, तो मेमोरी ऑर्डर तर्क क्या उचित/आवश्यक है?
या, क्या मैं यहां खरपतवार में हूं और इस तक पहुंचने का एक बेहतर तरीका है?
'atomic_signal_fence' केवल थ्रेड के बीच ऑर्डर करने की गारंटी देता है और उसी थ्रेड में सिग्नल हैंडलर चल रहा है। इसी तरह 'atomic_thread_fence' केवल धागे के बीच क्रम पर लागू होता है। यदि आप दो अन्य संदर्भों के बीच आदेश की गारंटी देने की कोशिश कर रहे हैं तो न तो पोर्टेबल है। उदाहरण के लिए विंडोज 'atomic_signal_fence' पर कुछ भी करने की आवश्यकता नहीं है क्योंकि विंडोज एसिंक्रोनस सिग्नल का समर्थन नहीं करता है। –
@RossRidge - मुझे atomic_signal_fence का उपयोग करने के बारे में थोड़ा अजीब लगा, क्योंकि, जैसा कि आप इंगित करते हैं, यहां कोई सिग्नल नहीं है। लेकिन यह एकमात्र चीज थी जो उपरोक्त मेरी रूपरेखा के अनुसार "काम" करती थी। मुझे मानक में कोई भी भाषा नहीं दिखाई दे रही थी, हालांकि कार्यान्वयन में एसिंक सिग्नल नहीं होने पर कॉल पर atomic_signal_fence को कॉल करने की अनुमति होगी। यह सी ++ 14 मानक के 28.9.7 में राज्य करता है कि "कंपाइलर ऑप्टिमाइज़ेशन और लोड और स्टोर्स की पुनरीक्षण उसी तरह से अवरुद्ध होती है जैसे कि atomic_thread_fence, लेकिन हार्डवेयर बाड़ निर्देश ... उत्सर्जित नहीं होते हैं।" – acm
यह एक सूचनात्मक (गैर-मानक) नोट है, यह कार्यान्वयन पर बाधा नहीं डालता है। मानक ऐसी कोई भी भाषा प्रदान नहीं करता है जो आपको "परमाणु_थ्रेड_फेंस (ऑर्डर) के समतुल्य" पर निर्भर करता है, सिवाय इसके कि परिणामस्वरूप ऑर्डरिंग बाधाएं केवल थ्रेड के बीच स्थापित होती हैं और एक ही थ्रेड में निष्पादित सिग्नल हैंडलर " । ध्यान दें कि 'atomic_thread_fence' को मानक द्वारा परिभाषित अनुसार परमाणु वस्तुओं पर परमाणु संचालन के संदर्भ में परिभाषित किया गया है। तो यदि आप 'std :: परमाणु प्रकारों का उपयोग नहीं कर रहे हैं तो न तो कार्य करने के लिए कार्य की गारंटी है। –