Bir C # uygulamasında oluşturabileceğiniz maksimum iş parçacığı sayısı nedir? Ve bu sınıra ulaştığınızda ne olur? Bir çeşit istisna atıldı mı?
Bir C # uygulamasında oluşturabileceğiniz maksimum iş parçacığı sayısı nedir? Ve bu sınıra ulaştığınızda ne olur? Bir çeşit istisna atıldı mı?
Yanıtlar:
Doğal bir sınır yoktur. Maksimum iş parçacığı sayısı, kullanılabilir fiziksel kaynakların miktarına göre belirlenir. Ayrıntılar için Raymond Chen'in bu makalesine bakın .
Maksimum iş parçacığı sayısının ne olduğunu sormanız gerekiyorsa, muhtemelen yanlış bir şey yapıyorsunuzdur.
[ Güncelleme : Sadece ilgi çekici: .NET Thread Pool varsayılan iş parçacığı sayısı:
(Bu sayılar donanıma ve işletim sistemine bağlı olarak değişebilir)]
Mitch haklı. Kaynaklara (belleğe) bağlıdır.
Raymond'un makalesi C # iş parçacıklarına değil, Windows iş parçacıklarına ayrılmış olsa da, mantık aynı şekilde uygulanır (C # iş parçacıkları Windows iş parçacıklarıyla eşlenir).
Bununla birlikte, C # 'da olduğumuz için, tamamen hassas olmak istiyorsak, "başlatılan" ve "başlatılmamış" iş parçacıkları arasında ayrım yapmamız gerekir. Sadece başlatılan iş parçacıkları aslında yığın alanı ayırır (beklediğimiz gibi). Başlatılamayan iş parçacıkları yalnızca bir iş parçacığı nesnesi için gerekli bilgileri ayırır (gerçek üyelerle ilgileniyorsanız reflektör kullanabilirsiniz).
Aslında kendiniz test edebilirsiniz, karşılaştırın:
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)
{
}
}
ile:
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)
{
}
}
Sayaç değerini görmek için VS'de istisna (tabii ki bellek dışı) bir kesme noktası koyun. Tabii ki çok önemli bir fark var.
Sistemin kaç iş parçacığının çalıştırılması gerektiğine karar verebilmesi için iş parçacığı havuzunu (veya iş parçacığı havuzunu kullanan zaman uyumsuz delgates) kullanıyor olmalısınız.
C # üzerinden CLR'de Jeff Richter:
"CLR'nin 2.0 sürümünde, maksimum çalışan iş parçacığı sayısı varsayılan olarak makinedeki CPU başına 25'tir ve maksimum G / Ç iş parçacığı sayısı varsayılan olarak 1000'dir. 1000 sınırı etkin bir şekilde sınırsızdır."
Bunun .NET 2.0 tabanlı olduğunu unutmayın. Bu, .NET 3.5'te değişmiş olabilir.
[Düzenle] @Mitch'in işaret ettiği gibi, bu CLR ThreadPool'a özgüdür. Doğrudan iş parçacıkları oluşturuyorsanız @Mitch ve diğerlerinin yorumlarına bakın.
Bu kod parçasını kullanarak test edebilirsiniz :
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 bit ve 64 bit uygulama modlarına dikkat edin.
Hata ayıklama ThreadPool.GetMaxThreads yöntemini çalıştırmanızı tavsiye ederim
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
Dokümanlar ve örnekler: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8