为什么使用ThreadPool.SetMaxThreads设置线程池最大线程数却不起作用?
ThreadPool
A simple C++11 Thread Pool implementation
项目地址:https://gitcode.com/gh_mirrors/th/ThreadPool
免费下载资源
·
一、场景复现
通过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)通过尝试发现,
SetMinThreads
和SetMaxThreads
两个方法配合使用时,最大线程数小于计算机逻辑处理器个数也是可以限制线程池线程数量的
上面两种二选一,这里我选方案(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 年前
更多推荐
已为社区贡献1条内容
所有评论(0)