मेरे पास निष्पादन के क्रम को बदलने वाले कंपाइलर के बारे में प्रश्न है। मैं एक सिग्नलिंग तंत्र (थोरुग सेमफोर) के साथ महत्वपूर्ण खंड को बदलकर एक बहु-थ्रेड प्रोग्राम (सी भाषा) के प्रदर्शन में सुधार करने की कोशिश कर रहा हूं।अस्थिर या मेमोरी बाधा और ताले का उपयोग किए बिना निष्पादन के आदेश की गारंटी
मुझे यहां निष्पादन के आदेश की गारंटी देने की आवश्यकता है, और इस पर कुछ शोध कर रहे हैं। मैंने फ़ंक्शन के भीतर निष्पादन के आदेश पर कई प्रश्न देखा, लेकिन किसी फ़ंक्शन के भीतर किसी फ़ंक्शन पर अधिक चर्चा नहीं हुई।
https://en.wikipedia.org/wiki/Sequence_point नियम # 4 के आधार पर, नीचे दिए गए कोड हिस्सा गारंटी देता होगा *p->a
पहले मूल्यांकन किया जाना से पहले func2
func2
के बाद दर्ज किया गया है है कि 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
केवल तभी निष्क्रिय होता है जब वह धागा निष्क्रिय हो।
के बाद से पी परमाणु नहीं है, यह: * यह महत्वपूर्ण है कि p-> ख के बाद ही p-> एक सेट है के रूप में एक और धागा विभिन्न अनुरोध को संसाधित एक पाश में है की स्थापना की और है कि क्या p- द्वारा एक वैध अनुरोध को दिखाता है> है बी सेट है। * डेटा रेस की तरह बहुत दिखता है। – 2501
अपने संकलक सी 11 का समर्थन करता है, तो आप एटोमिक्स इस्तेमाल कर सकते हैं, उदाहरण के लिए: धागा 1 p- पर एक दुकान से रिलीज करता है> ख और धागा 2 एक पर p-> ख लोड प्राप्त करता है। – ninjalj