"जोरदार" से पहले क्या होता है?


10

वाक्यांश "जोरदार पहले होता है" 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 को दर्शाता है।


1
वर्तमान मसौदा मानक " एटमिक्स 31.4 ऑर्डर और स्थिरता: 4seq_cst में लागू होने वाले नियम के लिए एक शर्त के रूप में" बी से पहले एक दृढ़ता से होता है "भी संदर्भित करता है । यह C ++ 17 n4659 मानक में नहीं है, जहां 32.4 - 3 seq_cst ऑप्स के एकल कुल क्रम के अस्तित्व को परिभाषित करता है जो "प्रभावित होने से पहले" क्रम और सभी प्रभावित स्थानों के लिए संशोधन के आदेशों के अनुरूप है ; "दृढ़ता से" बाद के मसौदे में जोड़ा गया था।
पीटर कॉर्डेस

2
@PeterCordes मुझे लगता है कि उपभोग को छोड़कर टिप्पणी, यह बताते हुए कि यह HB है "सभी संदर्भ में" / "मजबूत" और फ़ंक्शन पॉइंटर्स को कॉल करने के बारे में बात करना एक मृत सस्ता है। यदि एक थ्रेडेड प्रोग्राम atexit()एक थ्रेड में और exit()दूसरे में कॉल करता है , तो शुरुआती के लिए केवल उपभोग-आधारित निर्भरता को ले जाने के लिए पर्याप्त नहीं है क्योंकि परिणाम तब exit()उसी थ्रेड द्वारा लागू किए जाने पर भिन्न होते हैं । मेरे एक पुराने जवाब ने इस अंतर को चिंतित किया।
इविलोनेटेक्सिस्ट इडोनाटेक्सिस्ट


@IwillnotexistIdonotexist क्या आप भी MT प्रोग्राम से बाहर निकल सकते हैं? क्या यह मौलिक रूप से एक टूटा हुआ विचार नहीं है?
जिज्ञासु

1
@curiousguy यही उद्देश्य है exit()कोई भी धागा बाहर निकलने से पूरे कार्यक्रम को मार सकता है, या मुख्य धागा बाय-आउट से बाहर निकल सकता है return। इसके परिणामस्वरूप atexit()हैंडलर और सभी थ्रेड्स की मृत्यु हो जाती है जो वे कर रहे थे।
इविलनोटिक्सिस्ट इडोनाटेक्सिस्ट

जवाबों:


5

पेश किए जाने से पहले "दृढ़ता से क्यों होता है?" सहज रूप से, "पहले होता है" के साथ इसका अंतर और संबंध क्या है?

"बस पहले होता है" के लिए खुद को संभालो! Cppref के इस वर्तमान स्नैपशॉट पर एक नज़र डालें https://en.cppreference.com/w/cpp/atomic/memory_order

यहां छवि विवरण दर्ज करें

ऐसा लगता है कि "बस होता है-पहले" C ++ 20 में जोड़ा जाता है।

बस-पहले होता है

थ्रेड्स के बावजूद, मूल्यांकन ए बस होता है-मूल्यांकन बी से पहले यदि निम्न में से कोई भी सत्य है:

1) A को अनुक्रमित किया जाता है-B से पहले

2) एक सिंक्रोनाइज़-बी के साथ

3) ए बस होता है-एक्स से पहले, और एक्स बस होता है-बी से पहले

ध्यान दें: बिना उपभोग कार्यों के, बस होता है-पहले और होता है-पहले संबंध समान हैं।

तो बस एचबी और एचबी एक ही हैं सिवाय इसके कि वे किस तरह से संचालन को संभालते हैं। एचबी देखें

क्या होता है-पहले

थ्रेड्स के बावजूद, मूल्यांकन A होता है-मूल्यांकन B से पहले यदि निम्न में से कोई भी सत्य है:

1) A को अनुक्रमित किया जाता है-B से पहले

2) B से पहले एक इंटर-थ्रेड होता है

कार्यान्वयन यह सुनिश्चित करने के लिए आवश्यक है कि ऐसा होने से पहले संबंध चक्रीय है, यदि आवश्यक हो तो अतिरिक्त सिंक्रनाइज़ेशन शुरू करके (यह केवल आवश्यक हो सकता है यदि उपभोग ऑपरेशन शामिल है, तो बैटी एट अल देखें)

उपभोग करने के संबंध में वे अलग कैसे हैं? इंटर-थ्रेड-एचबी देखें

इंटर-थ्रेड होता है-पहले

थ्रेड्स के बीच, मूल्यांकन बी से पहले एक इंटर-थ्रेड होता है यदि निम्न में से कोई भी सत्य है

1) A सिंक्रोनाइज़-बी के साथ

2) A, B से पहले निर्भरता-आदेश है

3) ...

...

एक ऑपरेशन जो निर्भरता का आदेश दिया गया है (यानी रिलीज / खपत का उपयोग करता है) एचबी है लेकिन जरूरी नहीं कि बस एचबी-एचबी हो।

उपभोग से अधिक आराम है, इसलिए यदि मैं सही ढंग से समझता हूं, तो एचबी सिंपली-एचबी की तुलना में अधिक आराम से है।

दृढ़ता से होता है-पहले

थ्रेड्स के बावजूद, मूल्यांकन एक दृढ़ता से होता है-मूल्यांकन बी से पहले यदि निम्न में से कोई भी सत्य है:

1) A को अनुक्रमित किया जाता है-B से पहले

2) A, B के साथ सिंक्रोनाइज़ करता है और A और B दोनों क्रमिक रूप से सुसंगत परमाणु संचालन करते हैं

3) A का अनुक्रम होता है- X ​​से पहले, X बस होता है-Y से पहले, और Y का अनुक्रम होता है-B से पहले

4) एक दृढ़ता से होता है-एक्स से पहले, और एक्स दृढ़ता से होता है-बी से पहले

नोट: अनौपचारिक रूप से, यदि A दृढ़ता से B से पहले होता है, तो A सभी संदर्भों में B से पहले मूल्यांकन किया हुआ प्रतीत होता है।

ध्यान दें: दृढ़ता से होता है-इससे पहले कि आप उपभोग कार्यों को छोड़ दें।

तो एक रिलीज / खपत ऑपरेशन मजबूत-एचबी नहीं हो सकता है।

रिलीज / अधिग्रहण एचबी और सिंपल-एचबी हो सकता है (क्योंकि रिलीज / अधिग्रहण सिंक्रोनाइज़-साथ) लेकिन जरूरी नहीं कि स्ट्रॉन्गली-एचबी हो। क्योंकि दृढ़ता से एचबी विशेष रूप से कहता है कि ए को बी-के साथ सिंक्रनाइज़ करना होगा और एक क्रमिक रूप से सुसंगत ऑपरेशन होना चाहिए।

                            Is happens-before guaranteed?

                        HB             Simply-HB          Strongly-HB

relaxed                 no                 no                 no
release/consume        yes                 no                 no      
release/acquire        yes                yes                 no
S.C.                   yes                yes                yes

नोट में "ए, सभी संदर्भों में बी से पहले मूल्यांकन किया गया प्रतीत होता है" क्या मतलब है?

सभी संदर्भ: सभी थ्रेड्स / सभी सीपीयू देखते हैं (या "अंततः" उसी आदेश पर सहमत होंगे)। यह अनुक्रमिक स्थिरता की गारंटी है - सभी चर का एक वैश्विक कुल संशोधन आदेश। श्रृंखलाओं में भाग लेने वाले थ्रेड्स के लिए केवल संशोधित संशोधन आदेश प्राप्त करें / जारी करें। श्रृंखला के बाहर थ्रेड्स को सैद्धांतिक रूप से एक अलग आदेश देखने की अनुमति है।

मुझे नहीं पता कि स्ट्रांगली-एचबी और सिंपल-एचबी को क्यों पेश किया गया। शायद यह स्पष्ट करने में मदद करें कि उपभोग के आसपास कैसे संचालित किया जाए? जोरदार-एचबी में एक अच्छा गुण होता है - अगर एक धागा ए जोरदार होता है-बी से पहले, यह जानता है कि सभी धागे एक ही चीज का निरीक्षण करेंगे।

खपत का इतिहास:

पॉल ई। मैककेनी सी और सी ++ मानकों में खपत के लिए जिम्मेदार है। पॉइंटर असाइनमेंट और इसके द्वारा इंगित की गई मेमोरी के बीच ऑर्डरिंग की गारंटी देता है। इसका आविष्कार DEC अल्फा के कारण किया गया था। डीईसी अल्फ़ा सट्टेबाज़ी से एक सूचक को निष्क्रिय कर सकता है, इस प्रकार इसे रोकने के लिए एक मेमोरी बाड़ भी था। डीईसी अल्फा अब नहीं बना है और न ही प्रोसेसर का आज यह व्यवहार है। खपत बहुत आराम करने का इरादा है।


1
सुखद दुख। मुझे यह सवाल पूछने का लगभग अफसोस है। मैं आसान सी ++ मुद्दों से निपटने के लिए वापस जाना चाहता हूं जैसे कि इटरेटर अमान्यकरण, तर्क निर्भर नाम लुकअप, टेम्प्लेट उपयोगकर्ता परिभाषित रूपांतरण ऑपरेटर, टेम्प्लेट तर्क डिडक्शन, जब नाम लुकअप एक सदस्य के बेस क्लास में दिखता है, और जब आप एक वस्तु के निर्माण की शुरुआत में एक आभासी आधार में बदल सकते हैं।
जिज्ञासु

पुन: भस्म। क्या आप दावा करते हैं कि उपभोग के आदेश का भाग्य डीईसी अल्फा के भाग्य से जुड़ा हुआ है और उस विशेष आर्क के बाहर कोई मूल्य नहीं है?
क्यूरियस गुय

1
यह एक अच्छा सवाल है। इसे अभी और देखते हुए, यह लगता है कि खपत सैद्धांतिक रूप से एआरएम और पावरपीसी जैसे कमजोर आदेश वाले मेहराब के लिए प्रदर्शन को बढ़ावा दे सकता है। मुझे इसे देखने के लिए कुछ और समय दें।
हम्फ्री विन्नैबागो

1
मेरा कहना है कि खपत अल्फ़ा के अलावा अन्य सभी कमजोर आईएसए के कारण मौजूद है । अल्फा एएसएम में केवल विकल्प आराम और अधिग्रहण (और seq-cst) हैं, निर्भरता आदेश नहीं। mo_consumeवास्तविक सीपीयू पर डेटा निर्भरता आदेश का लाभ उठाने का इरादा है, और यह औपचारिकता है कि कंपाइलर शाखा भविष्यवाणी के माध्यम से डेटा निर्भरता को नहीं तोड़ सकता है। उदाहरण के int *p = load(); tmp = *p;लिए संकलक द्वारा तोड़ा जा सकता है if(p==known_address) tmp = *known_address; else tmp=*p;अगर यह एक निश्चित सूचक मान सामान्य होने की उम्मीद करने के लिए कुछ कारण था। यह आराम के लिए कानूनी है लेकिन उपभोग नहीं।
पीटर कॉर्ड्स

@PeterCordes सही ... कमजोर ऑर्डर के साथ मेहराब को अधिग्रहण के लिए एक मेमोरी बाधा का उत्सर्जन करना पड़ता है, लेकिन (सैद्धांतिक रूप से) उपभोग के लिए नहीं। ऐसा लगता है कि अगर आपको लगता है कि अल्फा कभी अस्तित्व में नहीं था, तब भी हम उपभोग करेंगे? इसके अलावा, आप मूल रूप से कह रहे हैं कि उपभोग एक फैंसी (या "मानक") संकलक बाधा है।
हम्फ्री विनबैगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.