一、场景复现

通过ThreadPool.SetMaxThreads设置最大线程数是15,通过循环20次分配线程,理论上不管循环多少次,最多只能分配15个线程,但是现在分配了20个,是怎么回事?

1、代码:

{
	ThreadPool.SetMaxThreads(15, 15);  //设置最大线程数为15个
	
	ManualResetEvent manualResetEvent = new ManualResetEvent(false);
	
	//循环开启线程
	for (int i = 0; i < 20; i++)
	{
	    ThreadPool.QueueUserWorkItem(t =>
	    {
	        Console.WriteLine($"当前的线程id为:{Thread.CurrentThread.ManagedThreadId:00},线程序号为:{t}");
	    }, i);
	}
	manualResetEvent.Set();
	manualResetEvent.WaitOne();
	Console.WriteLine($"所有任务执行完成!");
}

2、运行结果

为什么分配了20个线程?设置没起作用?
在这里插入图片描述

二、分析解决

因为SetMaxThreads方法设置线程最大值是不能小于计算机逻辑处理器个数(如8核16线程,即不能小于16)
在这里插入图片描述

  • (1)将最大线程数设置大于计算机逻辑处理器个数
  • (2)通过尝试发现,SetMinThreadsSetMaxThreads两个方法配合使用时,最大线程数小于计算机逻辑处理器个数也是可以限制线程池线程数量的

上面两种二选一,这里我选方案(2)

1、代码

{
	ThreadPool.SetMinThreads(5, 5);  //设置最小线程数为5个
	ThreadPool.SetMaxThreads(15, 15);  //设置最大线程数为15个,这两个方法要配合使用才能控制线程数量
	
	ManualResetEvent manualResetEvent = new ManualResetEvent(false);
	
	//循环开启线程
	for (int i = 0; i < 20; i++)
	{
	    ThreadPool.QueueUserWorkItem(t =>
	    {
	        Console.WriteLine($"当前的线程id为:{Thread.CurrentThread.ManagedThreadId:00},线程序号为:{t}");
	    }, i);
	}
	manualResetEvent.Set();
	manualResetEvent.WaitOne();
	Console.WriteLine($"所有任务执行完成!");
}

2、运行结果

设置生效
在这里插入图片描述
方案(1)如图
在这里插入图片描述

GitHub 加速计划 / th / ThreadPool
7.74 K
2.22 K
下载
A simple C++11 Thread Pool implementation
最近提交(Master分支:2 个月前 )
9a42ec13 - 9 年前
fcc91415 - 9 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐