আপনি একটি সি # অ্যাপ্লিকেশনে সর্বাধিক সংখ্যক থ্রেড তৈরি করতে পারেন? এবং আপনি এই সীমা পৌঁছে যখন কি হবে? কোনও ধরণের ব্যতিক্রম কি ছুঁড়ে দেওয়া হয়?
আপনি একটি সি # অ্যাপ্লিকেশনে সর্বাধিক সংখ্যক থ্রেড তৈরি করতে পারেন? এবং আপনি এই সীমা পৌঁছে যখন কি হবে? কোনও ধরণের ব্যতিক্রম কি ছুঁড়ে দেওয়া হয়?
উত্তর:
কোন সহজাত সীমা নেই। উপলব্ধ থ্রেডের সর্বাধিক সংখ্যা উপলব্ধ শারীরিক সংস্থার পরিমাণ দ্বারা নির্ধারিত হয়। সুনির্দিষ্ট জন্য রেমন্ড চেনের এই নিবন্ধটি দেখুন ।
আপনি যদি সর্বোচ্চ সংখ্যক থ্রেড কী তা জিজ্ঞাসা করার প্রয়োজন হয় তবে আপনি সম্ভবত কিছু ভুল করছেন।
[ আপডেট : মাত্র আগ্রহের বাইরে:। নেট থ্রেড পুলের থ্রিডের ডিফল্ট সংখ্যা:
(এই সংখ্যাগুলি হার্ডওয়্যার এবং ওএসের উপর নির্ভর করে পরিবর্তিত হতে পারে)]
মিচ ঠিক আছে। এটি সম্পদের উপর নির্ভর করে (স্মৃতি)।
যদিও রেমন্ডের নিবন্ধটি উইন্ডোজ থ্রেডগুলিতে উত্সর্গীকৃত, সি # থ্রেডগুলিতে নয়, যুক্তিটি একই প্রযোজ্য (সি # থ্রেডগুলি উইন্ডোজ থ্রেডগুলিতে ম্যাপ করা আছে)।
তবে, আমরা যেমন সি # তে আছি, আমরা যদি পুরোপুরি সুনির্দিষ্ট হতে চাই, আমাদের "শুরু" এবং "নন-স্টার্ট" থ্রেডের মধ্যে পার্থক্য করতে হবে। কেবলমাত্র শুরু করা থ্রেডগুলি আসলে স্ট্যাকের স্থান সংরক্ষণ করে (যেমনটি আমরা আশা করতে পারি)। অ-শুরু করা থ্রেডগুলি কেবল একটি থ্রেড অবজেক্টের প্রয়োজনীয় তথ্য বরাদ্দ করে (প্রকৃত সদস্যদের সাথে আগ্রহী হলে আপনি প্রতিফলক ব্যবহার করতে পারেন)।
আপনি এটি নিজের জন্য পরীক্ষা করতে পারেন, তুলনা করুন:
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)
{
}
}
কাউন্টারটির মান দেখতে ভিএস-এ ব্যতিক্রম (অবশ্যই মেমরির বাইরে) একটি ব্রেকপয়েন্ট দিন। অবশ্যই একটি খুব উল্লেখযোগ্য পার্থক্য আছে।
আপনার থ্রেড পুল ব্যবহার করা উচিত (বা অ্যাসিঙ্ক ডেলগেটস, যার ফলে থ্রেড পুল ব্যবহার করা হয়) যাতে সিস্টেমটি সিদ্ধান্ত নিতে পারে যে কতগুলি থ্রেড চালানো উচিত।
সি # এর মাধ্যমে সিএলআরে জেফ রিখটার:
"সিএলআর এর ২.০ সংস্করণ সহ, মেশিনে সিপিইউতে কর্মী থ্রেডের সর্বাধিক সংখ্যা 25 এবং সর্বাধিক আই / ও থ্রেডের সংখ্যা 1000 এ ডিফল্ট হয় 1000 1000 এর একটি সীমা কার্যকরভাবে কোনও সীমা নয়" "
নোট করুন এটি .NET 2.0 এর উপর ভিত্তি করে। এটি .NET 3.5 এ পরিবর্তিত হতে পারে।
[সম্পাদনা] @ মিচ যেমন উল্লেখ করেছে, এটি সিএলআর থ্রেডপুলের সাথে সুনির্দিষ্ট। যদি আপনি থ্রেড তৈরি করেন তবে সরাসরি @ মিচ এবং অন্যদের মন্তব্য দেখুন।
আপনি এই স্নিপড কোড ব্যবহার করে এটি পরীক্ষা করতে পারেন :
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-বিট প্রয়োগের মোড থেকে সাবধান থাকুন।
আমি থ্রেডপুল.গেটম্যাক্স থ্রেডস পদ্ধতিটি ডিবাগে চালানোর পরামর্শ দিচ্ছি
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
দস্তাবেজ এবং উদাহরণ: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8.8