আমি অনুমান করি যে চলকটিতে 'উদ্বায়ী' কীওয়ার্ডের অভাবের কারণে অপ্টিমাইজারটি বোকা হয়ে যায় isComplete।
অবশ্যই, আপনি এটি যুক্ত করতে পারবেন না, কারণ এটি স্থানীয় পরিবর্তনশীল। এবং অবশ্যই এটি যেহেতু স্থানীয় পরিবর্তনশীল, তাই এটির মোটেই প্রয়োজন হবে না, কারণ স্থানীয়দের স্ট্যাকের উপর রাখা হয় এবং তারা স্বাভাবিকভাবে সর্বদা "সতেজ" থাকে।
যাইহোক , সংকলনের পরে, এটি আর স্থানীয় ভেরিয়েবল হয় না । যেহেতু এটি কোনও অনামী প্রতিনিধিতে অ্যাক্সেসযোগ্য তাই কোডটি বিভক্ত হয়ে এটি একটি সহায়ক শ্রেণি এবং সদস্য ক্ষেত্রে অনুবাদ করা হয়েছে, এরকম কিছু:
public static void Main(string[] args)
{
TheHelper hlp = new TheHelper();
var t = new Thread(hlp.Body);
t.Start();
Thread.Sleep(500);
hlp.isComplete = true;
t.Join();
Console.WriteLine("complete!");
}
private class TheHelper
{
public bool isComplete = false;
public void Body()
{
int i = 0;
while (!isComplete) i += 0;
}
}
আমি এখন কল্পনা করতে পারি যে মাল্টিথ্রেডেড পরিবেশে জেআইটি সংকলক / অপ্টিমাইজার, TheHelperক্লাস প্রক্রিয়াকরণ করার সময়, পদ্ধতিটির শুরুতে কোনও রেজিস্টার বা স্ট্যাক ফ্রেমের মূলত ক্যাশে করতে পারে falseএবং Body()পদ্ধতিটি শেষ না হওয়া পর্যন্ত এটিকে কখনই রিফ্রেশ করতে পারে না। এর কারণেই কোনও গ্যারান্টি নেই যে "= সত্য" কার্যকর হওয়ার আগে থ্রেড এবং পদ্ধতিটি শেষ হবে না, সুতরাং যদি কোনও গ্যারান্টি না থাকে তবে কেন এটি ক্যাশে রাখবেন না এবং প্রতিবার এটি পড়ার পরিবর্তে একবার হ্যাপ অবজেক্টটি পড়ার পারফরম্যান্সের উত্সাহ পান get পুনরাবৃত্তির।
মূল শব্দটির volatileঅস্তিত্বই এই কারণেই ।
এই সহায়ক-বর্গটি মাল্টি-থ্রেড পরিবেশে একটি সামান্য সামান্য আরও ভাল 1) সংশোধন করার জন্য , এটি থাকা উচিত:
public volatile bool isComplete = false;
তবে, অবশ্যই এটি যেহেতু এটি স্বয়ংক্রিয়ভাবে তৈরি কোড, আপনি এটি যুক্ত করতে পারবেন না। আরও ভাল পদ্ধতির lock()আশেপাশে কিছু পাঠ এবং লেখার জন্য যোগ করা isCompletedবা ব্যবহারের জন্য প্রস্তুত সিঙ্ক্রোনাইজেশন বা থ্রেডিং / টাস্কিং ইউটিলিটিগুলি খালি-ধাতু করার চেষ্টা না করে (যা এটি খালি ধাতব হবে না , যেহেতু এটি জিসি, জেআইটি এবং (..)) এর সাথে সিএলআরে সি # রয়েছে
ডিবাগ মোডের পার্থক্যটি সম্ভবত ঘটে কারণ ডিবাগ মোডে অনেকগুলি অপটিমাইজেশন বাদ দেওয়া হয়, সুতরাং আপনি পর্দায় যে কোডটি দেখছেন তা ডিবাগ করতে পারেন। অতএব while (!isComplete)অনুকূলিত হয় না যাতে আপনি সেখানে একটি ব্রেকপয়েন্ট নির্ধারণ করতে পারেন, এবং অতএব isCompleteপদ্ধতিটি শুরুতে কোনও রেজিস্টারে বা স্ট্যাকের সাথে আক্রমণাত্মকভাবে ক্যাশে করা হয় না এবং প্রতিটি লুপের পুনরাবৃত্তিতে হিপযুক্ত বস্তু থেকে পড়া হয়।
BTW। এটাই আমার অনুমান মাত্র। আমি এটি সংকলনের চেষ্টাও করি নি।
BTW। এটি কোনও বাগ বলে মনে হচ্ছে না; এটি একটি খুব অস্পষ্ট পার্শ্ব প্রতিক্রিয়া মত আরও। এছাড়াও, যদি আমি এটি সম্পর্কে সঠিক হয়ে থাকি তবে এটি ভাষার ঘাটতি হতে পারে - সি # কে "ভোল্টাইল" কীওয়ার্ড স্থানীয় ভেরিয়েবলগুলিতে রাখার অনুমতি দেওয়া উচিত যা বন্দী হয়ে সদস্য ক্ষেত্রে উন্নীত হয়।
1) সম্পর্কে এরিক Lippert থেকে একটি মন্তব্যের জন্য নিচে দেখুন volatileএবং / অথবা এই খুব আকর্ষণীয় যে কোড উপর নির্ভর নিশ্চিত জড়িত জটিলতা মাত্রা দেখাচ্ছে নিবন্ধটি volatileহয় নিরাপদ ..uh, ভাল ..uh, এর ঠিক আছে বলা যাক।