C # एप्लिकेशन में आप अधिकतम कितने थ्रेड बना सकते हैं? और जब आप इस सीमा तक पहुँच जाते हैं तो क्या होता है? क्या किसी तरह का अपवाद फेंका गया है?
C # एप्लिकेशन में आप अधिकतम कितने थ्रेड बना सकते हैं? और जब आप इस सीमा तक पहुँच जाते हैं तो क्या होता है? क्या किसी तरह का अपवाद फेंका गया है?
जवाबों:
कोई अंतर्निहित सीमा नहीं है। थ्रेड्स की अधिकतम संख्या उपलब्ध भौतिक संसाधनों की मात्रा से निर्धारित होती है। बारीकियों के लिए रेमंड चेन का यह लेख देखें ।
यदि आपको यह पूछने की आवश्यकता है कि थ्रेड्स की अधिकतम संख्या क्या है, तो आप शायद कुछ गलत कर रहे हैं।
[ अपडेट : बस ब्याज से बाहर: .NET थ्रेड पूल डिफ़ॉल्ट थ्रेड्स की संख्या:
(ये संख्या हार्डवेयर और OS के आधार पर भिन्न हो सकती है)]
मिच सही है। यह संसाधनों (मेमोरी) पर निर्भर करता है।
यद्यपि रेमंड का लेख विंडोज थ्रेड्स के लिए समर्पित है, सी # थ्रेड्स के लिए नहीं, तर्क एक ही लागू होता है (सी # थ्रेड्स विंडोज थ्रेड्स में मैप किए जाते हैं)।
हालाँकि, जैसा कि हम C # में हैं, यदि हम पूरी तरह से सटीक होना चाहते हैं, तो हमें "प्रारंभ" और "गैर-आरंभ" के बीच अंतर करने की आवश्यकता है। केवल थ्रेड्स वास्तव में स्टैक स्पेस आरक्षित करते हैं (जैसा कि हम उम्मीद कर सकते हैं)। गैर शुरू किए गए धागे केवल एक थ्रेड ऑब्जेक्ट द्वारा आवश्यक जानकारी आवंटित करते हैं (यदि आप वास्तविक सदस्यों में रुचि रखते हैं तो रिफ्लेक्टर का उपयोग कर सकते हैं)।
आप वास्तव में इसे अपने लिए परख सकते हैं, तुलना करें:
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)
{
}
}
काउंटर के मूल्य को देखने के लिए वीएस में अपवाद (स्मृति से बाहर, निश्चित रूप से) में एक ब्रेकपॉइंट डालें। बहुत महत्वपूर्ण अंतर है, निश्चित रूप से।
आपको थ्रेड पूल का उपयोग करना चाहिए (या async डेलगेट्स, जो बदले में थ्रेड पूल का उपयोग करते हैं) ताकि सिस्टम यह तय कर सके कि कितने थ्रेड चलना चाहिए।
C # के माध्यम से CLR में जेफ रिक्टर:
"सीएलआर के संस्करण 2.0 के साथ, मशीन में 25 प्रति सीपीयू के लिए डिफ़ॉल्ट रूप से कार्यकर्ता थ्रेड्स की अधिकतम संख्या और I / O थ्रेड्स की अधिकतम संख्या 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 विधि चलाने की सलाह दूंगा
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
डॉक्स और उदाहरण: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8