वाक्यांश "जोरदार पहले होता है" C ++ ड्राफ्ट मानक में कई बार उपयोग किया जाता है।
उदाहरण के लिए: समाप्ति [basic.start.term] / 5
यदि स्थिर भंडारण अवधि के साथ किसी वस्तु के आरंभीकरण का पूरा होने से पहले std :: atexit (देखें, [support.start.term]) पर कॉल करने से पहले दृढ़ता से होता है, तो फ़ंक्शन को कॉल std :: atexit को दिया गया ऑब्जेक्ट के लिए विध्वंसक को कॉल करने से पहले अनुक्रम किया जाता है। यदि std :: atexit पर कॉल स्थैतिक रूप से स्थैतिक भंडारण अवधि के साथ किसी ऑब्जेक्ट के आरंभीकरण के पूरा होने से पहले होता है, तो ऑब्जेक्ट के लिए विध्वंसक को कॉल std :: atexit को दिए गए फ़ंक्शन के कॉल से पहले अनुक्रमित किया जाता है । यदि std :: atexit पर कॉल करने से पहले std करने के लिए किसी अन्य कॉल से पहले दृढ़ता से होता है :: atexit, फ़ंक्शन को कॉल दूसरी std को दिया गया :: atexit कॉल फ़ंक्शन से कॉल करने से पहले अनुक्रमित होती है पहला std :: atexit call।
और डेटा रेस में परिभाषित किया गया है [intro.races] / 12
एक मूल्यांकन एक दृढ़ता से मूल्यांकन डी से पहले होता है यदि, या तो
(12.1) A को D से पहले अनुक्रमित किया गया है, या
(१२.२) A, D के साथ सिंक्रोनाइज़ करता है और A और D दोनों क्रमिक रूप से लगातार परमाणु ऑपरेशन ([atomics.order], या)
(12.3) बी और सी के मूल्यांकन हैं जैसे कि ए बी से पहले अनुक्रमित है, बी बस सी से पहले होता है, और सी डी से पहले अनुक्रमित होता है, या
(१२.४) एक मूल्यांकन बी ऐसा है जो A दृढ़ता से B से पहले होता है, और B दृढ़ता से D से पहले होता है।
[नोट: अनौपचारिक रूप से, यदि A, B से पहले दृढ़ता से होता है, तो A सभी संदर्भों में B से पहले मूल्यांकन किया हुआ प्रतीत होता है। खपत ऑपरेशन को बाहर करने से पहले मजबूत रूप से होता है। - अंतिम नोट]
पेश किए जाने से पहले "दृढ़ता से क्यों होता है?" सहज रूप से, "पहले होता है" के साथ इसका अंतर और संबंध क्या है?
नोट में "ए, सभी संदर्भों में बी से पहले मूल्यांकन किया गया प्रतीत होता है" क्या मतलब है?
(नोट: इस प्रश्न की प्रेरणा इस उत्तर के तहत पीटर कॉर्डेस की टिप्पणियाँ हैं ।)
अतिरिक्त मसौदा मानक उद्धरण (पीटर कॉर्ड्स के लिए धन्यवाद)
आदेश और स्थिरता [atomics.order] / 4
सभी मेमोरी_ऑर्डर पर एक एकल कुल ऑर्डर S है: seq_cst संचालन, जिसमें बाड़ शामिल हैं, जो निम्नलिखित बाधाओं को संतुष्ट करता है। सबसे पहले, यदि A और B मेमोरी_ऑर्डर हैं: seq_cst ऑपरेशंस और A दृढ़ता से B से पहले होता है, तो A दूसरा बी। एस। सेकंड में, परमाणु युग्म A और B की प्रत्येक जोड़ी के लिए एक ऑब्जेक्ट M पर, जहाँ A को सहवास का आदेश दिया गया है बी से पहले, एस द्वारा संतुष्ट होने के लिए निम्नलिखित चार शर्तों की आवश्यकता होती है:
(४.१) यदि A और B दोनों मेमोरी_ऑर्डर हैं: seq_cst ऑपरेशंस, तो A, S में पूर्ववर्ती B है; तथा
(४.२) यदि A एक मैमोरी_ऑर्डर है: seq_cst ऑपरेशन और B एक मैमोरी_ऑर्डर से पहले होता है :: seq_cst बाड़ Y, तो A एक पूर्व Y में S; तथा
(4.3) यदि एक मैमोरी_ऑर्डर :: seq_cst फेंस X होता है, तो A और B एक मैमोरी_ऑर्डर से पहले होता है :: seq_cst ऑपरेशन, तो X S में B को प्रीजर्व करता है; तथा
(4.4) यदि एक मैमोरी_ऑर्डर :: seq_cst बाड़ X A से पहले होता है और B एक मैमोरी_ऑर्डर से पहले होता है :: seq_cst बाड़ Y, तो X, S के पूर्व Y को दर्शाता है।
atexit()
एक थ्रेड में और exit()
दूसरे में कॉल करता है , तो शुरुआती के लिए केवल उपभोग-आधारित निर्भरता को ले जाने के लिए पर्याप्त नहीं है क्योंकि परिणाम तब exit()
उसी थ्रेड द्वारा लागू किए जाने पर भिन्न होते हैं । मेरे एक पुराने जवाब ने इस अंतर को चिंतित किया।
exit()
। कोई भी धागा बाहर निकलने से पूरे कार्यक्रम को मार सकता है, या मुख्य धागा बाय-आउट से बाहर निकल सकता है return
। इसके परिणामस्वरूप atexit()
हैंडलर और सभी थ्रेड्स की मृत्यु हो जाती है जो वे कर रहे थे।
seq_cst
में लागू होने वाले नियम के लिए एक शर्त के रूप में" बी से पहले एक दृढ़ता से होता है "भी संदर्भित करता है । यह C ++ 17 n4659 मानक में नहीं है, जहां 32.4 - 3 seq_cst ऑप्स के एकल कुल क्रम के अस्तित्व को परिभाषित करता है जो "प्रभावित होने से पहले" क्रम और सभी प्रभावित स्थानों के लिए संशोधन के आदेशों के अनुरूप है ; "दृढ़ता से" बाद के मसौदे में जोड़ा गया था।