【发布时间】:2015-04-22 16:05:37
【问题描述】:
我正在编写一个可以运行各种任务的程序。我已经建立了一个我称之为“任务队列”的东西,我将在其中不断地抓取下一个要处理的任务(如果有的话)并启动一个新线程来处理该任务。但是,出于明显的原因,我想限制一次可以产生的线程数量。我创建了一个变量来跟上要生成的最大线程数和一个用于当前线程数的变量。我正在考虑使用锁来尝试准确地跟上当前的线程数。这是我的总体思路。
public class Program {
private static int mintThreadCount;
private static int mintMaxThreadCount = 10;
private static object mobjLock = new object();
static void Main(string[] args) {
mintThreadCount = 0;
int i = 100;
while(i > 0) {
StartNewThread();
i--;
}
Console.Read();
}
private static void StartNewThread() {
lock(mobjLock) {
if(mintThreadCount < mintMaxThreadCount) {
Thread newThread = new Thread(StartTask);
newThread.Start(mintThreadCount);
mintThreadCount++;
}
else {
Console.WriteLine("Max Thread Count Reached.");
}
}
}
private static void StartTask(object iCurrentThreadCount) {
int id = new Random().Next(0, 1000000);
Console.WriteLine("New Thread with id of: " + id.ToString() + " Started. Current Thread count: " + ((int)iCurrentThreadCount).ToString());
Thread.Sleep(new Random().Next(0, 3000));
lock(mobjLock) {
Console.WriteLine("Ending thread with id of: " + id.ToString() + " now.");
mintThreadCount--;
Console.WriteLine("Thread space release by id of: " + id.ToString() + " . Thread count now at: " + mintThreadCount);
}
}
}
由于我在两个地方锁定以访问同一个变量(启动新线程时递增,结束时递减),等待锁定递减的线程是否有可能挂起并且永远不会结束?从而达到最大线程数并且永远无法启动另一个?对我的方法有其他建议吗?
【问题讨论】:
-
我倾向于阅读 Thread Pooling,因为它可以解决您的很多问题。
-
是的,@oleksii 说的:使用
SemaphoreSlim。请参阅stackoverflow.com/a/19594643/56778 的简单示例 -
我还应该提到,在 Main() 中它将是 while(true) 并且不限于 100。我希望它持续运行。因此主线程永远不应该被阻塞。所以我看到线程池很有用,但我不确定它是否完全符合我想要完成的任务。我开始使用 Semaphore,但我想要一种方法来确保一次只能存在一定数量的线程,而不仅仅是一次限制代码块中的线程数。这样,我就不会产生无穷无尽的线程,然后一次运行一定数量的任务,而是产生有限的线程。
标签: c# multithreading locking