2010-01-22 16 views
5

यहां कुछ सी ++ कोड जो समानांतर में एकाधिक धागे से पहुंचे हैं।ताले के साथ स्टेटमेंट रीडरिंग

lock.Acquire(); 
current_id = shared_id; 
// small amounts of other code 
shared_id = (shared_id + 1) % max_id; 
lock.Release(); 
// do something with current_id 

ताला चर के वर्ग POSIX म्युटेक्स कार्यान्वयन के आसपास आवरण है: यह एक महत्वपूर्ण भाग है। मॉड्यूल संचालन के कारण, परमाणु संचालन का उपयोग करना संभव नहीं है।

क्या यह संभव है कि ओ 3 ध्वज वाला एक जीसीसी कंपाइलर कोड को अनुकूलित करता है ताकि चालू_आईडी का असाइनमेंट लॉक से पहले स्थानांतरित हो जाए?

उत्तर

3

ओ 3 के साथ संकलन करना संभव है!

संकलक कभी फ़ंक्शन कॉल में ऑप्टिमाइज़ नहीं करेगा जब तक फ़ंक्शन फ़ंक्शन-एट्रिब्यूट्स का उपयोग करके शुद्ध के रूप में चिह्नित नहीं किया जाता है।

म्यूटेक्स फ़ंक्शन शुद्ध नहीं हैं, इसलिए ओ 3 के साथ उनका उपयोग करना बिल्कुल सुरक्षित है।

+1

आपका मतलब है "जब तक कि फ़ंक्शन को शुद्ध ** के रूप में चिह्नित नहीं किया जाता है या संकलक यह निर्धारित करने में सक्षम होता है कि ऐसा करना सुरक्षित है ** बेशक। , अंतिम परिणाम वही है, संकलक सामान्य रूप से अनुकूलन नहीं करेगा, जब तक कि यह सत्यापित न हो कि यह सुरक्षित है। – jalf

+0

यदि 'current_id' और' shared_id' दोनों स्थानीय चर हैं जो मौजूदा दायरे से बच नहीं गए हैं (पता किसी और को नहीं दिया गया है, आदि) तो ऑप्टिमाइज़र बाहरी फ़ंक्शन कॉल से संभावित उत्परिवर्तन को अनदेखा कर सकता है। मुझे लगता है कि यह मामला यहां नहीं है, हालांकि – ephemient

+0

@ephemient: लेकिन अगर वे स्थानीय हैं और नहीं बाहरी लोगों में से एक जानता है कि बाहरी फ़ंक्शन कॉल उन्हें कैसे संशोधित कर सकता है? – Kosi2801

1

आम तौर पर संकलक को ऐसे हानिकारक अनुकूलन नहीं करना चाहिए। यदि आप अभी भी अनिश्चित हैं, तो आप उस आईडी चर पर ऑप्टिमाइज़ेशन को रोकने के लिए volatile कीवर्ड का उपयोग कर सकते हैं।

+0

अस्थिर सभी प्रासंगिक अनुकूलन को रोकता नहीं है। यह मूल्य को रजिस्टर में कैश होने से रोकता है, लेकिन बहुत कुछ और नहीं। पढ़ता/लिखना अभी भी पुन: व्यवस्थित किया जा सकता है। – jalf

+0

लिनक्स कर्नेल प्रलेखन के हिस्से के रूप में अस्थिरता का उपयोग करने का एक अच्छा उपचार: http://www.mjmwired.net/kernel/Documentation/volatile-cononsidered-harmful.txt – asveikau

+0

@jalf: लेकिन क्या कंपाइलर्स वास्तव में रीडर/लिखते हैं कि वे फ़ंक्शन-कॉल-सीमाओं को पार करते हैं? एक साथ मिश्रित असाइनमेंट और फ़ंक्शन कॉल काफी आम हैं और मुझे लगता है कि वेरिएबल्स का वर्क फ़ंक्शन कॉल के साथ ऑर्डर स्विच कर सकता है, तो जगह पर बहुत सारी समस्याएं होंगी। – Kosi2801

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