একটি নেট অ্যাপে থ্রেডের সর্বাধিক সংখ্যা?


140

আপনি একটি সি # অ্যাপ্লিকেশনে সর্বাধিক সংখ্যক থ্রেড তৈরি করতে পারেন? এবং আপনি এই সীমা পৌঁছে যখন কি হবে? কোনও ধরণের ব্যতিক্রম কি ছুঁড়ে দেওয়া হয়?


উত্তরটি পৃথক হবে যদি আপনি x64 ভিএম বা x86 ভিএম
ব্রায়ান আর বোন্ডি

আমার পরিস্থিতিতে এটি x86, তবে অন্য কারও প্রয়োজন হলে আপনি উভয়ের জন্য উত্তর সরবরাহ করতে পারেন?

উত্তর:


145

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

আপনি যদি সর্বোচ্চ সংখ্যক থ্রেড কী তা জিজ্ঞাসা করার প্রয়োজন হয় তবে আপনি সম্ভবত কিছু ভুল করছেন।

[ আপডেট : মাত্র আগ্রহের বাইরে:। নেট থ্রেড পুলের থ্রিডের ডিফল্ট সংখ্যা:

  • 1023 ফ্রেমওয়ার্ক 4.0 (32-বিট পরিবেশ)
  • ফ্রেমওয়ার্ক 4.0 এ 32767 (-৪-বিট পরিবেশ)
  • ফ্রেমওয়ার্ক 3.5 প্রতি কোর প্রতি 250
  • ফ্রেমওয়ার্ক 2.0 এ প্রতি কোর প্রতি 25

(এই সংখ্যাগুলি হার্ডওয়্যার এবং ওএসের উপর নির্ভর করে পরিবর্তিত হতে পারে)]


13
আপনি এটি কীভাবে বুঝতে পারলেন? আপনি কী জানেন? নেট 4.5 কী, বা 5.0 কী হবে?
গুডগুইস_অ্যাক্টিভেট

3
গণনাগুলি পেতে আপনি এই কোডটি ব্যবহার করতে পারেন: int কর্মচারী বিষয়গুলি; int সমাপ্তি পোর্টথ্রেডস; থ্রেডপুল.গেটম্যাক্স থ্রেডস (আউট ওয়ার্কারথ্রেডস, সমাপ্তি পোর্টথ্রেডস);
জালার্ড

1
@ মিচওয়েট আমি নিজেই ভাবছিলাম, কারণ লিঙ্কযুক্ত নিবন্ধটি নেট আলোচনা করে না, তবে সাধারণ 'ওল সি।
pqsk

1
@ লকমো: আপনি যদি কোনও থ্রেড তৈরি করতে না পারেন তবে আপনার সম্ভবত স্মৃতিশক্তি শেষ হয়ে গেছে! আমি চেষ্টা করে দেখিনি, তবে আমি ধরে নিচ্ছি একটি স্মৃতি ব্যতিক্রম ছুঁড়ে যাবে ....?
মিচ গম

1
@ লিয়াম লিঙ্কটি এখন ঠিক করা উচিত।
ইউজিন কোমিসারেঙ্কো

26

মিচ ঠিক আছে। এটি সম্পদের উপর নির্ভর করে (স্মৃতি)।

যদিও রেমন্ডের নিবন্ধটি উইন্ডোজ থ্রেডগুলিতে উত্সর্গীকৃত, সি # থ্রেডগুলিতে নয়, যুক্তিটি একই প্রযোজ্য (সি # থ্রেডগুলি উইন্ডোজ থ্রেডগুলিতে ম্যাপ করা আছে)।

তবে, আমরা যেমন সি # তে আছি, আমরা যদি পুরোপুরি সুনির্দিষ্ট হতে চাই, আমাদের "শুরু" এবং "নন-স্টার্ট" থ্রেডের মধ্যে পার্থক্য করতে হবে। কেবলমাত্র শুরু করা থ্রেডগুলি আসলে স্ট্যাকের স্থান সংরক্ষণ করে (যেমনটি আমরা আশা করতে পারি)। অ-শুরু করা থ্রেডগুলি কেবল একটি থ্রেড অবজেক্টের প্রয়োজনীয় তথ্য বরাদ্দ করে (প্রকৃত সদস্যদের সাথে আগ্রহী হলে আপনি প্রতিফলক ব্যবহার করতে পারেন)।

আপনি এটি নিজের জন্য পরীক্ষা করতে পারেন, তুলনা করুন:

    static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                newThread.Start();
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

সঙ্গে:

   static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

কাউন্টারটির মান দেখতে ভিএস-এ ব্যতিক্রম (অবশ্যই মেমরির বাইরে) একটি ব্রেকপয়েন্ট দিন। অবশ্যই একটি খুব উল্লেখযোগ্য পার্থক্য আছে।


9

আমি সি # কনসোল দিয়ে 64 বিট সিস্টেমে একটি পরীক্ষা করেছি, ব্যতিক্রমটি 2949 থ্রেড ব্যবহার করে মেমরির বাইরে type

আমি বুঝতে পারি আমাদের থ্রেডিং পুল ব্যবহার করা উচিত, যা আমি করি তবে এই উত্তরটি মূল প্রশ্নের জবাবে;)


6

আপনার থ্রেড পুল ব্যবহার করা উচিত (বা অ্যাসিঙ্ক ডেলগেটস, যার ফলে থ্রেড পুল ব্যবহার করা হয়) যাতে সিস্টেমটি সিদ্ধান্ত নিতে পারে যে কতগুলি থ্রেড চালানো উচিত।


উত্তর হল সিস্টেম সিদ্ধান্ত নেন দিন।
ইয়ান বয়ড 21

@ ইয়ান: আমি আপনাকে হ্রাস করেছি কারণ একই উত্তরদাতাকে নয় মাস আগে দেওয়া হয়েছিল।
জন স্যান্ডার্স

11
লিঙ্ক করুন। কারও উত্তর হিসাবে থ্রেড পুলের কোনও উল্লেখ আমি দেখতে পাচ্ছি না।
আয়ান বাল্ড

4

সি # এর মাধ্যমে সিএলআরে জেফ রিখটার:

"সিএলআর এর ২.০ সংস্করণ সহ, মেশিনে সিপিইউতে কর্মী থ্রেডের সর্বাধিক সংখ্যা 25 এবং সর্বাধিক আই / ও থ্রেডের সংখ্যা 1000 এ ডিফল্ট হয় 1000 1000 এর একটি সীমা কার্যকরভাবে কোনও সীমা নয়" "

নোট করুন এটি .NET 2.0 এর উপর ভিত্তি করে। এটি .NET 3.5 এ পরিবর্তিত হতে পারে।

[সম্পাদনা] @ মিচ যেমন উল্লেখ করেছে, এটি সিএলআর থ্রেডপুলের সাথে সুনির্দিষ্ট। যদি আপনি থ্রেড তৈরি করেন তবে সরাসরি @ মিচ এবং অন্যদের মন্তব্য দেখুন।


নেট নেট 3.5 সম্পর্কে আপনার মন্তব্যে আপনি সিএলআর 2.0 এবং .NET 2.0 বিভ্রান্ত করছেন।
bzlm

আমি যতদূর জানি নেট নেট ২.০ (। নেট ৩.৫ এর অংশ) এর জন্য এসপি 1 কর্মী থ্রেড ডিফল্টকে থ্রেড পুলের জন্য সিপিইউ / কোর প্রতি 250 এ পরিবর্তন করে।
মাইকেল দামাতভ

0

আপনি এই স্নিপড কোড ব্যবহার করে এটি পরীক্ষা করতে পারেন :

private static void Main(string[] args)
{
   int threadCount = 0;
   try
   {
      for (int i = 0; i < int.MaxValue; i ++)
      {
         new Thread(() => Thread.Sleep(Timeout.Infinite)).Start();
         threadCount ++;
      }
   }
   catch
   {
      Console.WriteLine(threadCount);
      Console.ReadKey(true);
   }
}

32-বিট এবং 64-বিট প্রয়োগের মোড থেকে সাবধান থাকুন।


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