2017-03-10 15 views
6

मेरे पास निष्पादन के क्रम को बदलने वाले कंपाइलर के बारे में प्रश्न है। मैं एक सिग्नलिंग तंत्र (थोरुग सेमफोर) के साथ महत्वपूर्ण खंड को बदलकर एक बहु-थ्रेड प्रोग्राम (सी भाषा) के प्रदर्शन में सुधार करने की कोशिश कर रहा हूं।अस्थिर या मेमोरी बाधा और ताले का उपयोग किए बिना निष्पादन के आदेश की गारंटी

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

https://en.wikipedia.org/wiki/Sequence_point नियम # 4 के आधार पर, नीचे दिए गए कोड हिस्सा गारंटी देता होगा *p->a पहले मूल्यांकन किया जाना से पहले func2func2 के बाद दर्ज किया गया है है कि p एक इनपुट के रूप लेता है (यह मानते हुए संकलक अनुसूची बिंदु के नियम यहां परिभाषित का पालन करता है)?

func1 (struct *p) { 
    p->a = x; 
    func2 (p); 
} 

func2 (struct *p) { 
    p->b = y; 
    releaseSemaphore(s); 
} 

यह p->b सेट कर दिया जाता है कि बाद ही p->a के रूप में एक और धागा एक पाश विभिन्न अनुरोध पर कार्रवाई करने में है और p->b सेट है या द्वारा एक वैध अनुरोध को दिखाता है सेट कर दिया जाता महत्वपूर्ण है। सेमफोर को रिहा करना केवल निष्क्रिय होता है (और सैमफोर के लिए इंतजार कर रहा है), लेकिन यदि यह अन्य अनुरोधों को संसाधित करने में व्यस्त है, तो यह p->b बाद में जांच करेगा, और हम गारंटी नहीं दे सकते कि func1 केवल तभी निष्क्रिय होता है जब वह धागा निष्क्रिय हो।

+1

के बाद से पी परमाणु नहीं है, यह: * यह महत्वपूर्ण है कि p-> ख के बाद ही p-> एक सेट है के रूप में एक और धागा विभिन्न अनुरोध को संसाधित एक पाश में है की स्थापना की और है कि क्या p- द्वारा एक वैध अनुरोध को दिखाता है> है बी सेट है। * डेटा रेस की तरह बहुत दिखता है। – 2501

+0

अपने संकलक सी 11 का समर्थन करता है, तो आप एटोमिक्स इस्तेमाल कर सकते हैं, उदाहरण के लिए: धागा 1 p- पर एक दुकान से रिलीज करता है> ख और धागा 2 एक पर p-> ख लोड प्राप्त करता है। – ninjalj

उत्तर

2

सं। अनुक्रम बिंदु क्रम थ्रेड सीमाओं में संक्रमण नहीं करता है। यही कारण है कि हमें पहली जगह मेमोरी ऑर्डरिंग गारंटी की आवश्यकता क्यों है।

अनुक्रम बिंदु क्रम हमेशा थ्रेड के लिए गारंटी (मॉड्यूल एएस-आई-नियम) की गारंटी देता है जो कोड निष्पादित करता है। कोई भी अन्य धागा उस धागे के मनमाना क्रम में लिख सकता है। इसका अर्थ यह है कि भले ही थ्रेड # 1 यह सत्यापित कर सके कि यह एक निश्चित क्रम में लिखता है, थ्रेड # 2 अभी भी उन्हें एक अलग क्रम में देख सकता है। यही कारण है कि अस्थिर भी यहां पर्याप्त नहीं है।

तकनीकी रूप से इसे समझाया जा सकता है उदाहरण के लिए। कैश द्वारा थ्रेड # 1 द्वारा लिखे गए पहले लिखने वाले बफर पर जा सकते हैं, जहां वे अभी भी थ्रेड # 2 के लिए अदृश्य होंगे। केवल एक बार लिखने वाले बफर को मुख्य स्मृति में फ़्लश कर दिया जाता है, वे दिखाई देते हैं और हार्डवेयर को फ़्लशिंग से पहले लिखने की अनुमति दी जाती है।

ध्यान दें कि सिर्फ इसलिए कि प्लेटफ़ॉर्म को पुन: व्यवस्थित करने की अनुमति है, इसका मतलब यह नहीं है कि यह होगा। यह खतरनाक हिस्सा है। कोड जो एक प्लेटफार्म पर पूरी तरह ठीक हो जाएगा, दूसरे पर पोर्ट होने पर नीले रंग से बाहर हो सकता है। उचित मेमोरी ऑर्डरिंग का उपयोग करने से गारंटी है कि कोड हर जगह काम करेगा।

+1

इसके अलावा, शब्द 'अनुक्रम बिंदु' और अधिक आधुनिक और सटीक शब्दावली 'से पहले अनुक्रम' के पक्ष में पदावनत किया गया है। –

+0

धन्यवाद, कैश पर स्पष्टीकरण इस बिंदु को भरने में मदद करने के लिए बहुत कुछ था। –

1

कार्यान्वयन ऑर्डरिंग को तब तक बदल सकता है जब तक यह अन्य अनुवाद इकाइयों से फ़ंक्शन कॉल पर नहीं किया जाता है।

इस तरह की पुनरावृत्ति बहुप्रचार के लिए ऑर्थोगोनल है, यानी यह सिंगलथ्रेड और बहुप्रचारित दोनों कार्यक्रमों में किया जाता है।

समारोह func2 func1 रूप में एक ही अनुवाद इकाई में है, तो निष्पादन किया जा सकता है, जैसे कि:

func1 (struct *p) 
{ 
    func2 (p); 
    p->a = x; 
} 

उपयोग अस्थिर iff आप ऐसे reorderings रोकना चाहते हैं। (ध्यान दें कि उपरोक्त वर्णित पुनर्वितरण को रोकने के लिए यह किया जाता है, अन्य सिंक्रनाइज़ेशन उद्देश्यों के लिए नहीं। आपको उन लोगों के लिए परमाणु प्राइमेटिव का उपयोग करना होगा।आईएसओ/आईईसी 9899:)


(से उद्धरित 201x 5.1.2.3 कार्यक्रम निष्पादन 10)
वैकल्पिक रूप से, एक कार्यान्वयन, प्रत्येक अनुवाद इकाई के भीतर विभिन्न ऑप्टिमाइज़ेशन करते हैं हो सकता है इस तरह के कि वास्तविक अर्थ विज्ञान होगा अनुवाद इकाई सीमाओं में फ़ंक्शन कॉल करते समय केवल अमूर्त अर्थशास्त्र से सहमत हों।

(: आईएसओ/आईईसी 9899: से उद्धरित 201x 6.7.3 प्रकार क्वालिफायर 7)
एक वस्तु है कि अस्थिर योग्य प्रकार कार्यान्वयन के लिए अज्ञात तरीकों से संशोधित किया जा सकता है या अन्य अज्ञात दुष्प्रभाव हो । इसलिए किसी भी अभिव्यक्ति इस तरह के एक वस्तु को चर्चा करते हुए सार मशीन, 5.1.2.3 में वर्णित के रूप के नियमों के अनुसार कड़ाई से मूल्यांकन किया जाएगा। इसके अलावा, हर अनुक्रम बिंदु पर मूल्य पिछले वस्तु में संग्रहीत सार मशीन द्वारा निर्धारित इससे सहमत होगा, के रूप में अज्ञात जैसा कि पहले उल्लेख कारकों से संशोधित छोड़कर।

+0

उसी अनुवाद इकाई के भीतर इस पुनरावृत्ति में अंतर्दृष्टि के लिए धन्यवाद। प्रति दिन कुछ नया सीखें। अफ़सोस की बात है मैं केवल एक ही जवाब :) –

+0

@DanZ निश्चित रूप से यह पुनर्व्यवस्था कार्यक्रम उसी के नमूदार व्यवहार रखना चाहिए करने के लिए मेरे टिक दे सकते हैं। यह इस मामले में किया जा सकता है, क्योंकि संकलक देखता है कि फ़ंक्शन func2 में केवल सदस्य बी को संशोधित किया गया है, और सदस्य को बिल्कुल भी एक्सेस नहीं किया गया है। यदि यह मामला नहीं था, यदि सदस्य को फ़ंक्शन func2 में भी पढ़ा गया था, तो सदस्य को लिखने के लिए नीचे दिए गए फ़ंक्शन को स्थानांतरित नहीं किया जा सका। – 2501

संबंधित मुद्दे