NET- তে জম্বিগুলি কি বিদ্যমান?


385

নেট থেকে লক করা নিয়ে আমি সতীর্থের সাথে আলোচনা করছিলাম। তিনি নিম্ন-স্তরের এবং উচ্চ-স্তরের উভয় প্রোগ্রামিংয়ের বিস্তৃত পটভূমির সাথে একটি সত্যই উজ্জ্বল লোক, তবে নিম্ন স্তরের প্রোগ্রামিংয়ের সাথে তাঁর অভিজ্ঞতা আমার চেয়ে অনেক বেশি। যাইহোক, তিনি যুক্তি দিয়েছিলেন যে "জম্বি থ্রেড" কোনও সিস্টেম বিধ্বস্ত হওয়ার স্বীকারোক্তিজনকভাবে ছোট সম্ভাবনা এড়াতে যদি সম্ভব হয় তবে সমস্ত ক্ষেত্রে যদি ভারী-বোঝার অধীনে থাকা প্রত্যাশিত সমালোচনামূলক সিস্টেমগুলিতে নেট লকিং এড়ানো উচিত। আমি নিয়মিত লকিং ব্যবহার করি এবং "জম্বি থ্রেড" কী তা আমি জানতাম না, তাই জিজ্ঞাসা করেছি। তার ব্যাখ্যা থেকে আমি যে ধারণা পেয়েছি তা হ'ল একটি জম্বি থ্রেড একটি থ্রেড যা সমাপ্ত হয়েছে তবে এখনও কিছু সংস্থান থেকে কিছু সংস্থান রয়েছে। একটি উদাহরণস্বরূপ যে একটি জম্বি থ্রেড কোনও সিস্টেমকে ভেঙে ফেলতে পারে তার একটি উদাহরণ তিনি দিয়েছিলেন যে কোনও থ্রেডটি কোনও বস্তুতে লক হওয়ার পরে কিছু প্রক্রিয়া শুরু করে, এবং তারপরে লকটি প্রকাশের আগে কিছুটা সমাপ্ত হয়। এই পরিস্থিতিতে সিস্টেমটি ক্র্যাশ হওয়ার সম্ভাবনা রয়েছে, কারণ শেষ পর্যন্ত, সেই পদ্ধতিটি কার্যকর করার চেষ্টা করার ফলে থ্রেডগুলি সমস্ত বস্তুর অ্যাক্সেসের জন্য অপেক্ষা করবে যা কখনই ফিরে আসবে না, কারণ লকড অবজেক্টটি ব্যবহার করা থ্রেডটি মারা গেছে।

আমি মনে করি এটির মূল বক্তব্য আমি পেয়েছি তবে আমি যদি বেস থেকে বাইরে যাই তবে দয়া করে আমাকে জানান। ধারণাটি আমার কাছে বোধগম্য হয়েছিল। আমি পুরোপুরি নিশ্চিত হইনি যে এটি নেট আসরে ঘটতে পারে এমন বাস্তব দৃশ্য। আমি এর আগে কখনও "জম্বিগুলি" শুনিনি, তবে আমি বুঝতে পারি যে প্রোগ্রামাররা যারা নিম্ন স্তরে গভীরতার সাথে কাজ করেছেন তাদের কম্পিউটিং ফান্ডামেন্টালগুলির (যেমন থ্রেডিংয়ের মতো) গভীর ধারণা রয়েছে। আমি অবশ্যই লকিংয়ের মানটি দেখতে পাচ্ছি, এবং আমি অনেক বিশ্বমানের প্রোগ্রামারদের লিভারেজ লকিং দেখেছি। আমার নিজের জন্য এটি মূল্যায়নেরও সীমিত ক্ষমতা আছে কারণ আমি জানি যে lock(obj)বিবৃতিটি কেবলমাত্র সিনট্যাকটিক চিনির জন্য:

bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }

এবং কারণ Monitor.Enterএবং Monitor.Exitচিহ্নিত করা হয় extern। এটা অনুমেয় বলে মনে হয় যে .NET এমন একধরণের প্রক্রিয়াকরণ করে যা থ্রেডগুলি সিস্টেম উপাদানগুলির সংস্পর্শ থেকে রক্ষা করে যা এই ধরণের প্রভাব ফেলতে পারে, তবে এটি নিখুঁত অনুমানমূলক এবং সম্ভবত কেবল "জম্বি থ্রেড" এর কথা কখনও শুনিনি বলে ভিত্তি করে based আগে. সুতরাং, আমি আশা করছি আমি এখানে এ সম্পর্কে কিছু প্রতিক্রিয়া পেতে পারি:

  1. আমি এখানে যা ব্যাখ্যা করেছি তার চেয়ে কি "জম্বি থ্রেড" এর একটি পরিষ্কার সংজ্ঞা আছে?
  2. জম্বি থ্রেডগুলি .NET এ ঘটতে পারে? (কেন কেন না?)
  3. প্রযোজ্য হলে, NET- এ আমি কীভাবে জম্বি থ্রেড তৈরি করতে বাধ্য করতে পারি?
  4. যদি প্রযোজ্য হয়, NET- তে জম্বি থ্রেড দৃশ্যের ঝুঁকি না নিয়ে আমি কীভাবে লকিংয়ের সুবিধা অর্জন করতে পারি?

হালনাগাদ

এই প্রশ্নটি আমি দু'বছর আগে জিজ্ঞাসা করেছি। আজ এই ঘটেছে:

অবজেক্টটি একটি জম্বি অবস্থায় রয়েছে।


8
আপনি কি নিশ্চিত যে আপনার সহ-সঙ্গী ডেডলকিংয়ের বিষয়ে কথা বলেন না ??
Andreas Niedermair

10
@ আন্ড্রেসনিডেরমায়ার - আমি জানি যে অচলাবস্থা কী এবং এটি পরিষ্কারভাবে সেই পরিভাষার অপব্যবহারের বিষয় ছিল না। কথোপকথনে ডেডলকিংয়ের কথা উল্লেখ করা হয়েছিল এবং এটি "জম্বি থ্রেড" থেকে স্বতন্ত্র ছিল। আমার কাছে, মূল পার্থক্যটি হ'ল একটি মৃত লকটিতে দ্বিমুখী অন-সংশোধনযোগ্য নির্ভরতা থাকে যেখানে জম্বি থ্রেড একমুখী হয় এবং এটি একটি সমাপ্ত প্রক্রিয়া প্রয়োজন। আপনি যদি দ্বিমত পোষণ করেন এবং এই জিনিসগুলি দেখার আরও ভাল উপায় বলে মনে করেন তবে দয়া করে ব্যাখ্যা করুন
স্মার্টকাভম্যান

19
আমি মনে করি "জম্বি" শব্দটি আসলে একটি ইউএনএক্স ব্যাকগ্রাউন্ড থেকে এসেছে, "জম্বি প্রক্রিয়া" এর মতোই, ঠিক ??? একটি "বোকচন্দর প্রক্রিয়া" ইউনিক্স মধ্যে একটি স্পষ্ট সংজ্ঞা: এটি একটি শিশু প্রক্রিয়া যা সমাপ্ত হয়েছে কিন্তু বর্ণনা যেখানে শিশু প্রক্রিয়ার পিতা বা মাতা এখনও "মুক্তি" শিশু প্রক্রিয়া (এবং সম্পদ) কল করে প্রয়োজন waitবা waitpid। শিশু প্রক্রিয়াটিকে তখন "জম্বি প্রক্রিয়া" বলা হয়। আরও দেখুন howtogeek.com/119815
hogliux

9
যদি আপনার প্রোগ্রামের কিছু অংশ ক্র্যাশ হয়ে প্রোগ্রামটিকে একটি সংজ্ঞায়িত অবস্থায় ফেলে রাখে তবে অবশ্যই এটি আপনার প্রোগ্রামের বাকী অংশে সমস্যা তৈরি করতে পারে। আপনি যদি একক থ্রেডেড প্রোগ্রামে ভুলভাবে ব্যতিক্রমগুলি পরিচালনা করেন তবে একই জিনিসটি ঘটতে পারে। সমস্যাটি থ্রেডগুলির সাথে নয়, সমস্যাটি হ'ল আপনার বৈশ্বিক পরিবর্তনীয় অবস্থা এবং আপনি অপ্রত্যাশিত থ্রেড সমাপ্তি সঠিকভাবে পরিচালনা করছেন না। আপনার "সত্যই উজ্জ্বল" সহকর্মী এটির পুরোপুরি বন্ধ।
জিম মিশেল

9
"প্রথম কম্পিউটারের পর থেকে, মেশিনে সর্বদা ভূত ছিল code কোডের এলোমেলো বিভাগগুলি যা একত্রে একত্রিত হয়ে অপ্রত্যাশিত প্রোটোকল তৈরি করেছিল ..."
ক্রিস ল্যাপ্লেন্ট

উত্তর:


242
  • আমি এখানে যা ব্যাখ্যা করেছি তার চেয়ে কি "জম্বি থ্রেড" এর একটি পরিষ্কার সংজ্ঞা আছে?

আমার কাছে বেশ ভাল ব্যাখ্যার মতো বলে মনে হচ্ছে - এমন একটি থ্রেড যা শেষ হয়ে গেছে (এবং অতএব আর কোনও সংস্থান প্রকাশ করতে পারে না), তবে যার সংস্থানগুলি (যেমন হ্যান্ডলগুলি) এখনও রয়েছে এবং (সম্ভাব্য) সমস্যা তৈরি করছে।

  • জম্বি থ্রেডগুলি .NET এ ঘটতে পারে? (কেন কেন না?)
  • প্রযোজ্য হলে, NET- এ আমি কীভাবে জম্বি থ্রেড তৈরি করতে বাধ্য করতে পারি?

তারা নিশ্চিতভাবে, দেখুন, আমি একটি তৈরি করেছি!

[DllImport("kernel32.dll")]
private static extern void ExitThread(uint dwExitCode);

static void Main(string[] args)
{
    new Thread(Target).Start();
    Console.ReadLine();
}

private static void Target()
{
    using (var file = File.Open("test.txt", FileMode.OpenOrCreate))
    {
        ExitThread(0);
    }
}

এই প্রোগ্রামটি একটি থ্রেড শুরু করে Targetযা কোনও ফাইল খোলে এবং তারপরে তত্ক্ষণাত ব্যবহার করে নিজেকে হত্যা করে ExitThreadফলস্বরূপ জম্বি থ্রেড হ্যান্ডলটিকে কখনই "test.txt" ফাইলটিতে ছাড়বে না এবং সুতরাং প্রোগ্রামটি শেষ না হওয়া পর্যন্ত ফাইলটি উন্মুক্ত থাকবে (আপনি প্রক্রিয়া এক্সপ্লোরার বা অনুরূপ সাথে পরীক্ষা করতে পারেন)। "টেস্ট.টিএসটিএসটি" এর হ্যান্ডেলটি না GC.Collectবলা পর্যন্ত প্রকাশ করা হবে না - এটি প্রমাণিত করে যে এটি একটি জম্বি থ্রেড তৈরি করার চিন্তা করেছিলাম তার থেকেও আরও বেশি কঠিন যা হ্যান্ডলগুলি ফাঁস করে)

  • যদি প্রযোজ্য হয়, NET- তে জম্বি থ্রেড দৃশ্যের ঝুঁকি না নিয়ে আমি কীভাবে লকিংয়ের সুবিধা অর্জন করতে পারি?

আমি যা করেছি তা করো না!

যতক্ষণ না আপনার কোডটি সঠিকভাবে নিজের পরে পরিষ্কার হয়ে যায় ( নিরাপদ হ্যান্ডলগুলি বা অপরিশোধিত সংস্থান নিয়ে কাজ করে সমতুল্য ক্লাস ব্যবহার করুন ) এবং যতক্ষণ না আপনি অদ্ভুত এবং আশ্চর্যজনক উপায়ে থ্রেডগুলি মারার উপায় থেকে বের হন না (নিরাপদ উপায় কেবলমাত্র থ্রেডগুলিকে কখনও মেরে ফেলবেন না - এগুলি নিজেকে স্বাভাবিকভাবে শেষ করতে দিন, বা প্রয়োজনে ব্যতিক্রমগুলির মাধ্যমে), কিছুটা খুব খারাপ হয়ে গেলে (যেমন সিএলআরতে কিছু ভুল হয়ে গেছে) যদি আপনি জম্বি থ্রেডের অনুরূপ কিছু পেতে যাচ্ছেন তবে একমাত্র উপায় ।

প্রকৃতপক্ষে এটি একটি জম্বি থ্রেড তৈরি করা আশ্চর্যজনকভাবে কঠিন (আমাকে পি / ইনভোক করতে হয়েছিল এমন কোনও ফাংশন যা আপনাকে ডকুমেন্টেশনে আপনাকে সি এর বাইরে কল না করার জন্য বলেছিল)। উদাহরণস্বরূপ, নিম্নলিখিত (জঘন্য) কোডটি আসলে একটি জম্বি থ্রেড তৈরি করে না।

static void Main(string[] args)
{
    var thread = new Thread(Target);
    thread.Start();
    // Ugh, never call Abort...
    thread.Abort();
    Console.ReadLine();
}

private static void Target()
{
    // Ouch, open file which isn't closed...
    var file = File.Open("test.txt", FileMode.OpenOrCreate);
    while (true)
    {
        Thread.Sleep(1);
    }
    GC.KeepAlive(file);
}

কিছুটা ভয়াবহ ভুল করার পরেও, "টেস্ট.টিএসটিএসটি" -এর হ্যান্ডেলটি কল করার সাথে সাথে এখনও বন্ধ হয়ে গেছে Abort(চূড়ান্তকরণের অংশ হিসাবে fileযার জন্য কভারগুলির অধীনে SafeFileHandle তার ফাইলের হ্যান্ডেল মোড়ানোর জন্য ব্যবহার করে )

সিএভেনহুইস উত্তরের লকিং উদাহরণটি সম্ভবত থ্রেডটিকে অদ্ভুত উপায়ে বন্ধ করার পরে কোনও সংস্থান (এই ক্ষেত্রে একটি লক) প্রকাশ করতে ব্যর্থ হওয়ার সহজতম উপায় তবে lockপরিবর্তে কোনও বিবৃতি ব্যবহার করে সহজেই স্থির করা যায় , বা রিলিজ একটি finallyব্লক করা।

আরো দেখুন


3
আমার মনে আছে আমি যখন ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহার করে এক্সেল এ স্টাফ সংরক্ষণের সাথে খেলতাম তখন আমি সমস্ত উত্স সমস্ত সময় ছাড়িনি (কারণ আমি কেবল ডিবাগিং এড়িয়েছি)) টাস্ক ম্যানেজারে আমি পরে প্রায় 50 এক্সেল প্রক্রিয়া দেখেছি। আমি zombieexcelprocesses তৈরি করেছি?
স্টিফান

3
@ জাস্টিন - +1 - দুর্দান্ত উত্তর। আমি ExitThreadযদিও আপনার কলটি সম্পর্কে একটু সংশয়ী । স্পষ্টতই, এটি কার্যকর হয় তবে এটি বাস্তববাদী দৃশ্যের চেয়ে চতুর কৌশল হিসাবে বেশি অনুভব করে। আমার লক্ষ্যগুলির মধ্যে একটি হ'ল কী করা উচিত তা শিখতে হবে যাতে আমি দুর্ঘটনাক্রমে .NET কোড দিয়ে জম্বি থ্রেড তৈরি না করি। আমি সম্ভবত বুঝতে পেরেছিলাম যে সিট ++ কোড কল করার ফলে NET কোড থেকে এই সমস্যার কারণ হতে পারে calling আপনি অবশ্যই এই জিনিসপত্র সম্পর্কে অনেক কিছু জানেন। একই ফলাফল নিয়ে আপনি কি অন্য কোনও মামলা (সম্ভবত অদ্ভুত, তবে অজান্তেই কখনই ঘটতে পারেননি এমন অদ্ভুত নয়) জানেন?
স্মার্টকাভম্যান

3
তাহলে উত্তরটি 'সি # 4 এ নেই', তাই না? জম্বি থ্রেড পেতে যদি আপনাকে সিএলআর থেকে ঝাঁপিয়ে পড়তে হয় তবে এটি নেট সমস্যা বলে মনে হচ্ছে না।
গুড্ডর

4
@ স্টেফান আমি অবশ্যই প্রায় নিশ্চিতভাবেই বলব না। আপনি প্রচুর সময় যা বর্ণনা করেছেন তা আমি করেছি। এক্সেল প্রক্রিয়াগুলি জম্বি নয় কারণ এগুলি এখনও চলছে তবে সাধারণ ইউআইয়ের মাধ্যমে অবিলম্বে অ্যাক্সেসযোগ্য নয়। গেটোবজেক্টে কল করার মাধ্যমে আপনার সেগুলি পুনরুদ্ধার করতে সক্ষম হওয়া উচিত । Set excelInstance = GetObject(, "Excel.Application")
ড্যানিয়েল

7
"ফলস্বরূপ জম্বি থ্রেড হ্যান্ডেলটিকে কখনই" test.txt "ফাইলটিতে ছাড়বে না এবং সুতরাং প্রোগ্রামটি শেষ না হওয়া পর্যন্ত ফাইলটি উন্মুক্ত থাকবে" । ছোট প্রমাণ: `স্ট্যাটিক অকার্যকর মেইন (স্ট্রিং [] আরগস) {নতুন থ্রেড (জিসি কোলকলেট)। স্টার্ট (); নতুন থ্রেড (লক্ষ্য)। স্টার্ট (); Console.ReadLine (); } বেসরকারী স্ট্যাটিক শূন্য টার্গেট () {(var ফাইল = ফাইল.ওপেন ("test.txt", ফাইলমোড.অপেনআরক্রিট)) ব্যবহার করে {প্রস্থান করুন (0); }} প্রাইভেট স্ট্যাটিক অকার্যকর জিসি কোলকলেট () {যখন (সত্য) {থ্রেড.স্লিপ (10000); GC.Collect (); }} `
সিনিক্স

46

আমি আমার উত্তরটি কিছুটা সাফ করেছি, তবে রেফারেন্সের জন্য নীচে আসলটি রেখেছি left

এটি আমি প্রথমবারের মতো জম্বি শব্দটি শুনেছি তাই আমি এর সংজ্ঞাটি ধরে নেব:

এমন একটি থ্রেড যা এর সমস্ত সংস্থান প্রকাশ না করেই শেষ হয়ে গেছে

সুতরাং সেই সংজ্ঞাটি দেওয়া হয়েছে, তবে হ্যাঁ, আপনি অন্যান্য ভাষা (সি / সি ++, জাভা) এর মতো নেটও করতে পারেন।

যাইহোক , আমি থ্রেডযুক্ত, মিশন সমালোচনামূলক কোড। নেট এ লেখার ভাল কারণ হিসাবে মনে করি না। .NET এর বিপরীতে সিদ্ধান্ত নেওয়ার অন্যান্য কারণও থাকতে পারে তবে নেট লেখার কারণেই আপনি জম্বি থ্রেডগুলি একরকম পেতে পারেন তা আমার কাছে বোধগম্য নয়। জ্যাম্বি থ্রেডগুলি সি / সি ++ এ সম্ভব (আমি এমনকি তর্ক করতে পারি যে সি তে জড়ান এটি অনেক সহজ) এবং অনেকগুলি সমালোচনামূলক, থ্রেডযুক্ত অ্যাপস সি / সি ++ (উচ্চ ভলিউম ট্রেডিং, ডাটাবেস ইত্যাদিতে) রয়েছে।

উপসংহার আপনি যদি কোনও ভাষা ব্যবহারের সিদ্ধান্ত নেওয়ার প্রক্রিয়াধীন থাকেন তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি বড় চিত্রটি বিবেচনায় আনুন: পারফরম্যান্স, টিম দক্ষতা, সময়সূচী, বিদ্যমান অ্যাপ্লিকেশনগুলির সাথে একীকরণ ইত্যাদি, , তবে যেহেতু এটি সি এর মতো অন্যান্য ভাষার সাথে তুলনা করে নেট নেট এ আসলেই এতটা কঠিন, তাই আমি মনে করি যে এই উদ্বেগটি উপরে বর্ণিত ভাষাগুলির মতো অন্যান্য জিনিসগুলির দ্বারা ছাপিয়ে যাবে। শুভকামনা!

মূল উত্তর বোকচন্দর অস্তিত্ব যদি আপনি সঠিক থ্রেডিং কোড লিখতে হবে না পারবেন না। সি / সি ++ এবং জাভা এর মতো অন্যান্য ভাষার ক্ষেত্রেও এটি একই। কিন্তু .NET এ থ্রেডড কোড না লেখার কারণ নয়।

এবং ঠিক অন্য কোনও ভাষার মতো, কিছু ব্যবহারের আগে দামটি জানুন। এটি হুডের নীচে কী ঘটছে তা জানতেও সহায়তা করে যাতে আপনি কোনও সম্ভাব্য সমস্যার আগেই ধারণা করতে পারেন।

মিশন সমালোচনামূলক সিস্টেমগুলির জন্য নির্ভরযোগ্য কোড আপনি যে কোনও ভাষায়ই লিখতে পারবেন না But তবে আমি ইতিবাচক। নেটটিতে সঠিকভাবে কাজ করা অসম্ভব। এছাড়াও আফাইক,। নেট থ্রেডিং সি / সি ++ তে থ্রেডিংয়ের চেয়ে আলাদা নয়, এটি কিছু। নেট নির্দিষ্ট নির্মাণ (আরডাব্লুএল এবং ইভেন্টের ক্লাসের হালকা ওজন সংস্করণের মত) ব্যতীত একই সিস্টেম কলগুলি ব্যবহার করে (বা এর থেকে নির্মিত)।

Z প্রথমবার আমি জুম্বি শব্দটি শুনেছি তবে আপনার বর্ণনার ভিত্তিতে, আপনার সহকর্মী সম্ভবত একটি থ্রেড বোঝাচ্ছেন যা সমস্ত সংস্থান ছাড়াই বন্ধ হয়ে যায়। এটি সম্ভবত অচলাবস্থা, মেমরি ফাঁস বা অন্য কোনও খারাপ পার্শ্ব প্রতিক্রিয়ার কারণ হতে পারে। এটি স্পষ্টতই কাম্য নয় তবে এককভাবে খুঁজে বের করা যায় possibility এই সম্ভাবনার কারণে নেট সম্ভবত কোনও ভাল ধারণা নয় কারণ এটি অন্যান্য ভাষায়ও সম্ভব। আমি এমনকি তর্ক করতে পারি যে নেট। নেট থেকে সি / সি ++ এ গণ্ডগোল করা সহজ especially সুতরাং এটি আপনার ব্যক্তিগত পরিস্থিতিতে নির্ভর করে on আপনি আপনার অ্যাপ্লিকেশন থেকে গতি প্রতি আউন্স বের করে আনতে চান এবং যেমন ঘনিষ্ঠ সম্ভব, তারপর .net এর মতো বেয়ার মেটাল পেতে চান শক্তিসেরা সমাধান না। যদি আপনি একটি শক্ত বাজেটে থাকেন এবং ওয়েব পরিষেবাদি / বিদ্যমান। নেট লাইব্রেরি / ইত্যাদির সাথে প্রচুর পরিমাণে ইন্টারফেসিং করেন তবে নেটও ভাল পছন্দ হতে পারে


(1) আমি নিশ্চিত নই যে আমি যখন শেষ মুহুর্তের externপদ্ধতিগুলিতে আঘাত করি তখন হুডের নীচে কী ঘটেছিল তা কীভাবে নির্ধারণ করা যায়। যদি আপনার কোনও পরামর্শ পাওয়া যায় তবে আমি এটি শুনতে পছন্দ করব। (২) আমি। নেট এ কাজ করা সম্ভব বলে সম্মত হব। লকিংয়ের মাধ্যমে এটি সম্ভব বলে আমি বিশ্বাস করতে চাই, তবে আজকে তা প্রমাণ করার জন্য আমার কাছে সন্তোষজনক উত্তর খুঁজে
পাইনি

1
@smartcaveman তুমি কি বোঝাতে যদি lockingহয় lockশব্দ, তারপর সম্ভবত না যেহেতু এটি মৃত্যুদন্ড সিরিয়েলাইজ। থ্রুটপুট সর্বাধিক করতে, আপনার কোডের বৈশিষ্ট্যগুলির উপর নির্ভর করে আপনাকে সঠিক নির্মানগুলি ব্যবহার করতে হবে। আমি বলব যদি আপনি সি / সি ++ / জাভা / যা পাইথ্রেড / বুস্ট / থ্রেড পুল / যা কিছু ব্যবহার করে নির্ভরযোগ্য কোড লিখতে পারেন তবে আপনি এটি সি # তেও লিখতে পারেন। তবে আপনি যদি কোনও লাইব্রেরি ব্যবহার করে কোনও ভাষায় নির্ভরযোগ্য কোড লিখতে না পারেন তবে আমি সন্দেহ করি যে # # তে লেখাটি কোনও আলাদা হবে।
জেরাহিমেল

@ স্মার্টকাভেম্যান হুডের নীচে কী রয়েছে তা নির্ধারণ করার জন্য, গুগল হ্যাপগুলিকে সহায়তা করে এবং আপনি যদি ওয়েবে সন্ধানের জন্য খুব উদ্ভট হন তবে প্রতিচ্ছবিটি খুব কার্যকর। তবে থ্রেডিং ক্লাসগুলির জন্য, আমি এমএসডিএন ডকুমেন্টেশন খুব দরকারী বলে মনে করি। এবং এর অনেকগুলি কেবল সি এনওয়ে ব্যবহার করে একই সিস্টেমের কলগুলির জন্য কেবল মোড়ক।
জেরাহিমেল

1
@ স্মার্টকাভম্যান মোটেও তা নয়, আমি এর অর্থ বোঝাতে চাইনি। আমি যদি সেভাবে এসে পৌঁছায় তবে আমি দুঃখিত। আমি যা বলতে চেয়েছিলাম তা হল যে আপনি কোনও সমালোচনামূলক অ্যাপ্লিকেশন লেখার সময় নেটও লিখে ফেলবেন না। অবশ্যই, আপনি এমন কাজ করতে পারবেন যা জম্বি থ্রেডের চেয়ে অনেক খারাপ হতে পারে (যা আমি মনে করি যে কেবল থ্রেড যা কোনও নিয়ন্ত্রণহীন সম্পদ প্রকাশ করে না, যা অন্য ভাষায় পুরোপুরি ঘটতে পারে: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 14268080/… ), তবে আবার, এর অর্থ এই নয় যে। নেট কোনও কার্যকর সমাধান নয়।
জেরাহ্মিল

2
আমার মনে হয় না। নেট মোটেই খারাপ প্রযুক্তি। এটি আসলে আমার প্রাথমিক বিকাশের কাঠামো। তবে, এর কারণ হিসাবে, আমি মনে করি এটি গুরুত্বপূর্ণ যে ত্রুটিগুলি এটি সংবেদনশীল তা আমি বুঝতে পারি। মূলত, আমি সিট আউট করছি। নেট, তবে কারণ আমি এটি পছন্দ করি, কারণ আমি করি না। (এবং কোনও উদ্বেগ নেই ভাই, আমি আপনাকে +1-এডি করছি)
স্মার্টক্যাভম্যান

26

এই মুহূর্তে আমার উত্তরটি বেশিরভাগ নীচের মন্তব্যে সংশোধন করা হয়েছে। আমি উত্তরটি মুছব না কারণ আমার খ্যাতি পয়েন্টগুলি দরকার কারণ মন্তব্যে থাকা তথ্যগুলি পাঠকদের পক্ষে মূল্যবান হতে পারে।

অমর নীল ইঙ্গিত করেছে যে .NET 2.0 এ এবং আপ finallyব্লকগুলি থ্রেড অ্যাওরাটসে অনাক্রম্য। এবং আন্দ্রেস নাইডারমায়ারের মন্তব্য হিসাবে, এটি প্রকৃত জম্বি থ্রেড নাও হতে পারে, তবে নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে থ্রেডটি বাতিল করা সমস্যার কারণ হতে পারে:

class Program
{
    static readonly object _lock = new object();

    static void Main(string[] args)
    {
        Thread thread = new Thread(new ThreadStart(Zombie));
        thread.Start();
        Thread.Sleep(500);
        thread.Abort();

        Monitor.Enter(_lock);
        Console.WriteLine("Main entered");
        Console.ReadKey();
    }

    static void Zombie()
    {
        Monitor.Enter(_lock);
        Console.WriteLine("Zombie entered");
        Thread.Sleep(1000);
        Monitor.Exit(_lock);
        Console.WriteLine("Zombie exited");
    }
}

তবে যখন একটি ব্যবহার lock() { }ব্লক, finallyএখনও কার্যকর করা হবে যখন একটি ThreadAbortExceptionহল যে ভাবে বহিস্কার।

নিম্নলিখিত তথ্যটি যেমন দেখা যাচ্ছে, কেবলমাত্র নেট 1 এবং নেট নেট 1.1 এর জন্য বৈধ:

যদি lock() { }ব্লকের অভ্যন্তরে অন্য কোনও ব্যতিক্রম ঘটে এবং ব্লকটি চালানো হতে চলেছে ThreadAbortExceptionঠিক তখন উপস্থিত হয়, finallyলকটি প্রকাশ হয় না। যেমনটি আপনি উল্লেখ করেছেন, lock() { }ব্লকটি এইভাবে সংকলিত হয়েছে:

finally 
{
    if (lockWasTaken) 
        Monitor.Exit(temp); 
}

যদি অন্য থ্রেড Thread.Abort()উত্পন্ন finallyব্লকের ভিতরে কল করে , লকটি প্রকাশ নাও হতে পারে।


2
আপনি কথা বলছেন lock()তবে আমি এর কোনও ব্যবহার দেখতে পাচ্ছি না ... তবে এটি কীভাবে সংযুক্ত? এই একটি "ভুল" ব্যবহার করা হয় Monitor.Enterএবং Monitor.Exit(ব্যবহার উদাসীন tryএবং finally)
আন্দ্রিয়াস Niedermair

4
আমি এটিকে একটি জম্বি-থ্রেড বলব না - এটি কেবলমাত্র সঠিক ব্যবহার Monitor.Enterএবং এর Monitor.Exitসঠিক ব্যবহার ছাড়া tryএবং finally- যাইহোক, আপনার দৃশ্যে অন্যান্য থ্রেডগুলি লক হয়ে যাবে যা স্থির থাকতে পারে _lock, তাই একটি অচলাবস্থার দৃশ্য আছে - অগত্যা জম্বি থ্রেড নয় ... এছাড়াও, আপনি লকটি ছেড়ে দিচ্ছেন না Main... তবে, আরে ... সম্ভবত ওপি জম্বি-থ্রেডের পরিবর্তে ডেডলকিংয়ের জন্য লক করছে :)
আন্দ্রেস নিডেরমায়ার

1
পছন্দ করেছেন সম্ভবত আমরা এটিকে একটি "থ্রেড যা কার্যকরকরণ বন্ধ করে দিয়েছে তবে সমস্ত সংস্থান প্রকাশ করেনি" বলতে পারি। আমার হোমওয়ার্ক মুছে ফেলার ও করার প্রলোভন দেখানো হয়েছে, তবে ওপির দৃশ্যের সাথে সাদৃশ্যটির জন্য উত্তর রেখে।
সি। এভেনহুইস

2
এখানে কোন অপরাধ! আসলে আপনার উত্তরটি আমাকে কেবল এটি সম্পর্কে ভাবতে পেরেছিল :) যেমন ওপি স্পষ্টভাবে লকগুলি প্রকাশ না করার বিষয়ে কথা বলছে, আমি বিশ্বাস করি তার সহ-সঙ্গী মৃত-লকিংয়ের বিষয়ে কথা বলেছেন - কারণ একটি লক কোনও আসল সংস্থান নয় যা কোনও সুতোর সাথে আবদ্ধ ( এটি ভাগ করা হয়েছে ... নিনা) - এবং সুতরাং যে কোনও "জম্বি" থ্রেডটি সেরা-অনুশীলনের সাথে আঁকড়ে ধরে এবং lockযথাযথ try/ finally-ব্যবহার ব্যবহার করে এড়ানো যেতে পারে
Andreas Niedermair

1
@ সি। এভেনহুইস - আমি নিশ্চিত নই যে আমার সংজ্ঞাটি সঠিক। আমি কেন প্রশ্নটি জিজ্ঞাসা করছি তার একটি অংশ এটি পরিষ্কার করা। আমি মনে করি ধারণাটি সি / সি ++
স্মার্টকাভম্যান

24

এটি জম্বি থ্রেড সম্পর্কে নয়, তবে ইফেক্টিভ সি # বইয়ের আইডিস্পোজেবল বাস্তবায়ন করার একটি বিভাগ রয়েছে, (আইটেম 17), যা জুম্বু অবজেক্ট সম্পর্কে আলোচনা করেছে যা আমি ভেবেছিলাম আপনি আকর্ষণীয় খুঁজে পেতে পারেন।

আমি নিজেই বইটি পড়ার পরামর্শ দিচ্ছি, তবে এর সংক্ষিপ্তসারটি হ'ল আপনার যদি হয় কোনও ক্লাস থাকে তা হয় আইডিজিপোজেবল বাস্তবায়ন করে, বা একটি ডেস্ক্ট্রাক্টর থাকে, তবে আপনার কেবলমাত্র যে বিষয়টি করা উচিত তা হ'ল সম্পদ প্রকাশ করা। আপনি যদি এখানে অন্য কিছু করেন, তবে এমন সুযোগ রয়েছে যে অবজেক্টটি আবর্জনা সংগ্রহ করা হবে না, তবে কোনওভাবেই অ্যাক্সেসযোগ্য হবে না।

এটি নীচের মত একটি উদাহরণ দেয়:

internal class Zombie
{
    private static readonly List<Zombie> _undead = new List<Zombie>();

    ~Zombie()
    {
        _undead.Add(this);
    }
}

যখন এই অবজেক্টে ডেস্ট্রাক্টরকে ডাকা হয়, তখন নিজের কাছে একটি উল্লেখ বিশ্বব্যাপী তালিকায় স্থাপন করা হয়, যার অর্থ এটি প্রোগ্রামের জীবনের স্মৃতিতে বাঁচে এবং স্মৃতিতে থাকে, কিন্তু অ্যাক্সেসযোগ্য নয়। এর অর্থ এই হতে পারে যে সংস্থানগুলি (বিশেষত নিয়ন্ত্রণহীন সংস্থানসমূহ) পুরোপুরি প্রকাশিত না হতে পারে, যা সমস্ত ধরণের সম্ভাব্য সমস্যার কারণ হতে পারে।

আরও একটি সম্পূর্ণ উদাহরণ নীচে। পূর্বাঞ্চ লুপটি পৌঁছে যাওয়ার পরে, আপনার অনডেড তালিকার প্রতিটি ছবিতে 150 টি করে জিনিস রয়েছে তবে চিত্রটি GC'd হয়েছে এবং আপনি যদি এটি ব্যবহার করার চেষ্টা করেন তবে আপনি একটি ব্যতিক্রম পান। এই উদাহরণে, আমি যখন চিত্রটি সংরক্ষণ করার চেষ্টা করি বা এমনকি উচ্চতা এবং প্রস্থের মতো মাত্রাগুলিও দেখি তখন চিত্রটির সাথে কিছু করার চেষ্টা করি এবং পরামিতিটি গ্রহণ করি (প্যারামিটারটি বৈধ নয়)

class Program
{
    static void Main(string[] args)
    {
        for (var i = 0; i < 150; i++)
        {
            CreateImage();
        }

        GC.Collect();

        //Something to do while the GC runs
        FindPrimeNumber(1000000);

        foreach (var zombie in Zombie.Undead)
        {
            //object is still accessable, image isn't
            zombie.Image.Save(@"C:\temp\x.png");
        }

        Console.ReadLine();
    }

    //Borrowed from here
    //http://stackoverflow.com/a/13001749/969613
    public static long FindPrimeNumber(int n)
    {
        int count = 0;
        long a = 2;
        while (count < n)
        {
            long b = 2;
            int prime = 1;// to check if found a prime
            while (b * b <= a)
            {
                if (a % b == 0)
                {
                    prime = 0;
                    break;
                }
                b++;
            }
            if (prime > 0)
                count++;
            a++;
        }
        return (--a);
    }

    private static void CreateImage()
    {
        var zombie = new Zombie(new Bitmap(@"C:\temp\a.png"));
        zombie.Image.Save(@"C:\temp\b.png");
    }
}

internal class Zombie
{
    public static readonly List<Zombie> Undead = new List<Zombie>();

    public Zombie(Image image)
    {
        Image = image;
    }

    public Image Image { get; private set; }

    ~Zombie()
    {
        Undead.Add(this);
    }
}

আবার, আমি সচেতন যে আপনি বিশেষত জম্বি থ্রেড সম্পর্কে জিজ্ঞাসা করেছিলেন, তবে প্রশ্নের শিরোনামটি নেট মধ্যে জম্বিগুলি সম্পর্কে এবং আমি এটির স্মরণ করিয়ে দিয়েছিলাম এবং অন্যেরা এটি আকর্ষণীয় বলে মনে করতে পারে!


1
এটা মজার. হয় _undeadস্ট্যাটিক হতে বোঝানো?
স্মার্টকাভম্যান

1
তাই আমি এটি চেষ্টা করেছি, "ধ্বংসাত্মক" অবজেক্টটি থেকে কিছু মুদ্রণ করে। এটি এটিকে একটি সাধারণ অবজেক্টের মতো আচরণ করে। এটি করতে সমস্যা আছে কি?
স্মার্টকাভম্যান

1
আমি আমার উত্তরটি একটি উদাহরণ দিয়ে আপডেট করেছি যা আশা করি বিষয়টি আরও স্পষ্টভাবে প্রদর্শিত হবে।
জেএমকে

1
আমি কেন জানি নিম্নচাপে পড়েছি জানি না। আমি এটি সহায়ক বলে মনে করি। এখানে একটি প্রশ্ন - আপনি কী ধরনের ব্যতিক্রম পেতে চলেছেন? আমি এটি প্রত্যাশা করি না NullReferenceException, কারণ অনুভূতিটি পাওয়া যায় যে অ্যাপ্লিকেশনটির চেয়ে গায়েব জিনিসটি মেশিনের সাথে আরও বেশি আবদ্ধ হওয়া দরকার। এটা কী ঠিক?
স্মার্টকাভম্যান

4
অবশ্যই এটি এতটা IDisposableসমস্যা নয়। আমি চূড়ান্তকরণকারীদের (ডেস্ট্রাক্টর) সাথে উদ্বেগ পেয়েছি তবে কেবল IDisposableকোনও বস্তু চূড়ান্তকরণকারী সারিতে যাবে না এবং এই জম্বি পরিস্থিতি ঝুঁকিপূর্ণ করবে। এই সতর্কতাটি চূড়ান্তকারীদের নিয়ে উদ্বেগ প্রকাশ করে এবং তারা ডিসপোজ পদ্ধতিগুলি কল করতে পারে। IDisposableচূড়ান্তকরণ ছাড়াই ধরণের ব্যবহৃত হয় এমন উদাহরণ রয়েছে । অনুভূতিটি রিসোর্স ক্লিন-আপের জন্য হওয়া উচিত, তবে এটি অ-তুচ্ছ রিসোর্স ক্লিন-আপ হতে পারে। আরএক্স বৈধভাবে IDisposableসাবস্ক্রিপশন পরিষ্কার করার জন্য ব্যবহার করে এবং অন্যান্য স্ট্রিম রিসোর্সগুলিতে কল করতে পারে। (আমি কোনও বিটিডব্লুকেই কম দেখিনি ...)
জেমস ওয়ার্ল্ড

21

ভারী লোডের অধীনে সমালোচনামূলক সিস্টেমে লক-ফ্রি কোড লেখার কাজটি মূলত পারফরম্যান্স ইম্প্রুভমেন্টের কারণে। LMAX এর মতো স্টাফগুলি দেখুন এবং এর দুর্দান্ত আলোচনার জন্য এটি কীভাবে "যান্ত্রিক সহানুভূতি" উপস্থাপন করে। জম্বি থ্রেড সম্পর্কে চিন্তিত যদিও? আমি মনে করি এটি একটি প্রান্তের কেস যা কেবল বাগ বাগিয়ে দেওয়ার মতো, এবং এটি ব্যবহার না করার উপযুক্ত কারণ নয় lock

আপনার বন্ধুটির মতো আরও শোনাচ্ছে যে কেবল অভিনব হয়ে উঠছে এবং আমার কাছে তার কাছে অস্পষ্ট বিদেশী পরিভাষা সম্পর্কে জ্ঞাত ধারণা প্রকাশ করছে! মাইক্রোসফ্ট ইউকে-তে আমি যতক্ষণ পারফরম্যান্স ল্যাব চালিয়ে যাচ্ছিলাম, NET- এ আমি কখনই এই সমস্যার নজির পাইনি।


2
আমি মনে করি বিভিন্ন সেট অভিজ্ঞতা আমাদের বিভিন্ন বাগ সম্পর্কে ভৌত করে তোলে। তিনি স্বীকার করেছেন এটি ব্যাখ্যা করার সময় এটি একটি চূড়ান্ত প্রান্তের মামলা, তবে যদি এটি সত্যিই একটি প্রান্ত-কেস হয় এবং কখনও কখনও ঘটে না, তবে আমি কমপক্ষে এটি আরও ভালভাবে বুঝতে চাই - আপনার
ইনপুটটির

1
যথেষ্ট ফর্সা। আমি চাইব না যে আপনি lockবিবৃতিটি সম্পর্কে অসতর্কভাবে উদ্বিগ্ন হন !
জেমস ওয়ার্ল্ড

1
এই সমস্যাটি সম্পর্কে যদি আমার আরও গভীর ধারণা হয় তবে আমি খুব কম চিন্তিত হব।
স্মার্টকাভম্যান

4
আমি উত্সাহিত করেছি কারণ আপনি কিছু থ্রেড-এফইউডি থেকে মুক্তি পাওয়ার চেষ্টা করছেন যার মধ্যে অনেক বেশি। লক-এফইউডি নিষ্পত্তি করতে আরও কাজ নিচ্ছে :) আমি যখন কেবল ডিভস একটি আনবাউন্ড স্পিনলক গ্রহণ করি, (পারফরম্যান্সের জন্য), যাতে তারা একটি বিস্তৃত সারিতে 50K ডেটা অনুলিপি করতে পারে।
মার্টিন জেমস

3
হ্যাঁ, সাধারণ এবং বিশেষ উভয় ক্ষেত্রেই। সঠিক লক-ফ্রি কোড রচনা প্রোগ্রামিংয়ের মতো চ্যালেঞ্জিং। বেশিরভাগ ক্ষেত্রে ক্ষেত্রে আমার অভিজ্ঞতায়, বড় চর্বিযুক্ত কোর্সযুক্ত (তুলনামূলকভাবে) lockব্লকগুলি বোঝা সহজ fine আপনার প্রয়োজন জানা না হওয়া পর্যন্ত আমি পারফরম্যান্স অপটিমাইজেশনের জন্য জটিলতা প্রবর্তন এড়াতে চাই।
জেমস ওয়ার্ল্ড

3

1. এখানে কি আমি ব্যাখ্যা করেছি তার চেয়ে "জম্বি থ্রেড" এর একটি পরিষ্কার সংজ্ঞা আছে?

আমি সম্মত হই যে "জম্বি থ্রেডস" বিদ্যমান, এটি এমন একটি পদ যা থ্রেডসের সাথে কী ঘটে যা সেই সংস্থানগুলিতে ছেড়ে যায় যা তারা ছেড়ে দেয় না এবং এখনও পুরোপুরি মারা যায় না, সুতরাং "জম্বি" নামটি আপনার তাই এই রেফারেলের ব্যাখ্যা অর্থের উপর ঠিক ঠিক!

২। নেট উপর জম্বি থ্রেডগুলি ঘটতে পারে? (কেন কেন না?)

হ্যাঁ তারা ঘটতে পারে। এটি একটি রেফারেন্স, এবং আসলে উইন্ডোজ দ্বারা "জম্বি" হিসাবে উল্লেখ করা হয়েছে: এমএসডিএন ডেড প্রক্রিয়াগুলি / থ্রেডের জন্য "জম্বি" শব্দটি ব্যবহার করে

ঘন ঘন ঘটে যাওয়া এটি অন্য গল্প, এবং এটি আপনার কোডিং কৌশল এবং অনুশীলনের উপর নির্ভর করে যেমন আপনার থ্রেড লক করা পছন্দ করে এবং এটি কিছুক্ষণের জন্য করেছি তবে আমি আপনার কাছে ঘটনার দৃশ্যটির বিষয়েও চিন্তা করব না।

এবং হ্যাঁ, @ কেভিনপ্যাঙ্কো মন্তব্যে সঠিকভাবে উল্লেখ করেছেন যে, "জম্বি থ্রেডস" ইউনিক্স থেকে এসেছে, এ কারণেই এগুলি এক্সকোড-অবজেক্টিভ সিতে ব্যবহৃত হয় এবং "এনএসজম্বি" হিসাবে পরিচিত এবং ডিবাগিংয়ের জন্য ব্যবহৃত হয়। এটি বেশ একইভাবে আচরণ করে ... কেবলমাত্র তফাতটি এমন একটি বস্তু যা মারা যাওয়া উচিত "জম্বি থ্রেড" এর পরিবর্তে ডিবাগিংয়ের জন্য "জুম্বোবজেক্ট" হয়ে ওঠে যা আপনার কোডের একটি সম্ভাব্য সমস্যা হতে পারে।


1
তবে এমএসডিএন যেভাবে জম্বি ব্যবহার করে তা এই প্রশ্নটি যেভাবে ব্যবহার করছে তার থেকে খুব আলাদা।
বেন ভয়েগট

1
ওহ হ্যাঁ আমি সম্মত, তবে আমি একটি বক্তব্য দিচ্ছিলাম যে এমনকি এমএসডিএন থ্রেডগুলিকে মৃত অবস্থায় জম্বি থ্রেড হিসাবে উল্লেখ করে। এবং তারা আসলে ঘটতে পারে।
এসএইচ

4
অবশ্যই, তবে এটি থ্রেডের একটি হ্যান্ডেল ধরে থাকা অন্য কিছু কোডের উল্লেখ করছে, থ্রেড হোল্ডিং হ্যান্ডলগুলি হস্তান্তর করে না যখন এটি বের হয়। আপনার প্রথম বাক্য, প্রশ্নের সংজ্ঞাটির সাথে একমত হয়ে কী ভুল হয়েছে।
বেন ভয়েগট

1
আহ আমি আপনার বক্তব্য দেখতে। সত্যি কথা বলতে আমি তা খেয়ালও করিনি। আমি তার বক্তব্যটির দিকে মনোনিবেশ করছিলাম যে সংজ্ঞাটি বিদ্যমান, এটি কীভাবে হয় তা নির্বিশেষে। মনে রাখবেন যে সংশ্লেষটি থ্রেডের সাথে কী ঘটে এবং কীভাবে এটি করা হয় তার কারণে না।
এসএইচ

0

আমি সহজেই জম্বি থ্রেডগুলি তৈরি করতে পারি।

var zombies = new List<Thread>();
while(true)
{
    var th = new Thread(()=>{});
    th.Start();
    zombies.Add(th);
}

এটি থ্রেড হ্যান্ডলগুলি ফাঁস করে (জন্য Join())। পরিচালিত বিশ্বে আমরা যতটা উদ্বিগ্ন এটি কেবল অন্য একটি মেমরি ফুটো।

এখন, থ্রেডটিকে এমনভাবে হত্যা করা যাতে এটি সত্যিই তালা ধরে থাকে তবে পিছনে ব্যথা হলেও সম্ভব। অন্য লোক ExitThread()কাজ করে। তিনি যেমন খুঁজে পেলেন, ফাইল হ্যান্ডেলটি জিসি দ্বারা পরিষ্কার হয়ে গেছে তবে lockকোনও বস্তুর আশেপাশে তা করা যায় না। তবে কেন আপনি এটা করবেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.