2016-06-15 13 views
5

निम्नलिखित सरल कोड को देखते हुए:पढ़ें उन्मूलन और संगामिति

class Program 
{ 
    static bool finish = false; 

    static void Main(string[] args) 
    { 
     new Thread(ThreadProc).Start(); 
     int x = 0; 
     while (!finish) 
     { 
      x++; 
     } 
    } 

    static void ThreadProc() 
    { 
     Thread.Sleep(1000); 
     finish = true; 
    } 
} 

और MSVS2015 (.NET 4.6) के साथ रिलीज मोड में चल रहा है हम ख़त्म न होने वाली आवेदन मिल जाएगा। ऐसा इसलिए होता है क्योंकि जेआईटी-कंपाइलर कोड उत्पन्न करता है जो finish केवल एक बार पढ़ता है, इसलिए भविष्य में अपडेट को अनदेखा कर रहा है।

सवाल यह है: जेआईटी-कंपाइलर को ऐसा अनुकूलन करने की अनुमति क्यों है? विनिर्देश का क्या हिस्सा इसे अनुमति देता है?

+0

मुझे लगता है कि, 'फिनिश' 'अस्थिर' बनाना इस मुद्दे को हल करता है, है ना? – dymanoid

+1

@dymanoid, ज़ाहिर है, लेकिन सवाल अलग है :) – ixSci

+0

संकलक किसी भी अनुकूलन के लिए स्वतंत्र है जब तक कि यह एक थ्रेड * पर चलने पर प्रोग्राम की शुद्धता में परिवर्तन नहीं करता है। यहां तक ​​कि बेवकूफ संकलक जो ऑप्टिमाइज़ेशन के साथ सीधा संकलन करता है, फिर भी हार्डवेयर द्वारा अपने स्वयं के अनुकूलन करने के लिए ट्रिप किया जाएगा। यदि आप बहु-थ्रेडिंग से निपट रहे हैं, तो आपके पास बहुत कम गारंटी है। – Luaan

उत्तर

8

यह खंड 10.5.3 में कवर किया जाता है - में वाष्पशील फील्ड्स C# Specification:

10.5.3 वाष्पशील फील्ड्स
(मैं हिस्सा जो नीचे अपनी टिप्पणियों को शामिल किया गया पर बल दिया गया है) जब फ़ील्ड-घोषणा में अस्थिर संशोधक शामिल होता है, तो उस घोषणा द्वारा पेश किए गए फ़ील्ड अस्थिर फ़ील्ड होते हैं।
गैर-अस्थिर फ़ील्ड के लिए, ऑप्टिमाइज़ेशन तकनीकों के लिए निर्देशों को पुन: व्यवस्थित करने से ऑप्टिमाइज़ेशन प्रोग्राम अप्रत्याशित और अप्रत्याशित परिणाम हो सकते हैं जो सिंक्रनाइज़ेशन के बिना फ़ील्ड तक पहुंच सकते हैं, जैसे कि लॉक-स्टेटमेंट (§8.12) द्वारा प्रदान किया गया। इन अनुकूलन को कंपाइलर द्वारा, रनटाइम सिस्टम द्वारा या हार्डवेयर द्वारा किया जा सकता है। अस्थिर क्षेत्रों के लिए, इस तरह के पुनर्निर्देशन अनुकूलन प्रतिबंधित हैं:
* अस्थिर क्षेत्र के एक पढ़ने को अस्थिर पढ़ने कहा जाता है। एक अस्थिर पढ़ने में "अर्थशास्त्र प्राप्त करना" है; यानी, यह अनुक्रम अनुक्रम में होने वाली स्मृति के किसी भी संदर्भ से पहले होने की गारंटी है।
* अस्थिर क्षेत्र के एक लेखन को अस्थिर लेखन कहा जाता है। एक अस्थिर लेखन "रिलीज semantics" है; यानी, निर्देश अनुक्रम में लिखने के निर्देश से पहले किसी भी स्मृति संदर्भ के बाद ऐसा होने की गारंटी है।
ये प्रतिबंध सुनिश्चित करते हैं कि सभी थ्रेड किसी अन्य थ्रेड द्वारा किए गए अस्थिर लेखनों को क्रम में प्रदर्शित किए जाएंगे। निष्पादन के सभी धागे से देखा गया अस्थिर लिखने का एकमात्र कुल क्रम प्रदान करने के लिए एक अनुरूप कार्यान्वयन की आवश्यकता नहीं है।

+0

हे, महान बयान। तो मुझे लगता है कि यह एक सी # तरीका है कि यह कहने के लिए कि इस तरह के मामलों में व्यवहार अपरिभाषित है। धन्यवाद! – ixSci

+1

सबसे अधिक संभावना यह कार्यान्वयन विशिष्ट ** बिल्कुल ** है ** क्या होता है, जिसका अर्थ है कि यदि आप .NET कोर, या ज़ैमरिन या मोनो या लिनक्स या आईओटी डिवाइस में सटीक कोड चलाते हैं, तो कोड * हो सकता है * व्यवहार अलग ढंग से। यद्यपि "अप्रत्याशित और अप्रत्याशित रूप से" इसे कवर करेगा, लेकिन शायद यह आपके घर को जला नहीं देगा :) –

+0

यह वास्तव में विनिर्देश का हिस्सा है जो कहता है "सभी दांव बंद हैं"। क्या हो सकता है यह समझाते हुए यह भी अपर्याप्त है, इसलिए "कवर" एक शब्द बहुत मजबूत हो सकता है। ईसीएमए -335 (जो रनटाइम को कवर करता है) की धारा I.12.6 इस विषय पर कुछ और कहने के लिए है। (हालांकि * अधिक * नहीं। और निश्चित रूप से सी # मानक को स्वयं को समझना है।) –

2

संकलक सोचता है (निम्नलिखित वादे करती) इस प्रकार है:

मैं क्रम में अपने कोड निष्पादित करेगा कि आप मुझसे पूछा गया है, कि किसी भी निर्देश है कि अपने एकल में चलाया जाता है कोड लिखा गया क्रम में किया जाएगा और पर आधारित यह मैं कृपया कोई भी अनुकूलन करूंगा, जो सिंगल-थ्रेडेड अनुक्रमिकता के अनुरूप है।

ठीक है, संकलक finish चर नहीं volatile के रूप में चिह्नित देखता है और इस तरह वह समझता है कि यह अन्य धागे से बदला नहीं जाएगा, तो वह यह है कि दूर हमेशा सच होने के रूप में हालत पर विचार में अनुकूलित करता है। डीबग मोड पर, यह अधिक लक्स सोच रहा है और यह अनुकूलन दूर नहीं करता है।

इस here पर अधिक।

+0

यही वह नहीं है जिसे मैंने पूछा था। मैं व्यवहार को समझता हूं लेकिन समझ में नहीं आया कि विनिर्देश का कौन सा हिस्सा इसे अनुमति देता है। – ixSci

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