निम्नलिखित सरल कोड को देखते हुए:पढ़ें उन्मूलन और संगामिति
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
केवल एक बार पढ़ता है, इसलिए भविष्य में अपडेट को अनदेखा कर रहा है।
सवाल यह है: जेआईटी-कंपाइलर को ऐसा अनुकूलन करने की अनुमति क्यों है? विनिर्देश का क्या हिस्सा इसे अनुमति देता है?
मुझे लगता है कि, 'फिनिश' 'अस्थिर' बनाना इस मुद्दे को हल करता है, है ना? – dymanoid
@dymanoid, ज़ाहिर है, लेकिन सवाल अलग है :) – ixSci
संकलक किसी भी अनुकूलन के लिए स्वतंत्र है जब तक कि यह एक थ्रेड * पर चलने पर प्रोग्राम की शुद्धता में परिवर्तन नहीं करता है। यहां तक कि बेवकूफ संकलक जो ऑप्टिमाइज़ेशन के साथ सीधा संकलन करता है, फिर भी हार्डवेयर द्वारा अपने स्वयं के अनुकूलन करने के लिए ट्रिप किया जाएगा। यदि आप बहु-थ्रेडिंग से निपट रहे हैं, तो आपके पास बहुत कम गारंटी है। – Luaan