打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#多线程之旅
userphoto

2020.11.17

关注

多线程之旅(1)_线程同步之AutoResetEvent和ManualResetEvent的区别、用法——附C#源码示例

多线程之旅(2)_创建一个属于自己的精简线程池_线程调度策略——附C#源码

多线程之旅(3)_如何使用lock()来实现对象和代码块的加锁功能(详解)

多线程之旅(4)_async/await的用法精细详解

多线程之旅(5)_眼花缭乱的sleep,wait,yield,join,Abort,ContinueWith,RunSynchronously,background方法详解

多线程之旅(6)_Semaphore和SemaphoreSlim关于WaitOne、Release的用法详解——附C#源码

多线程之旅(7)_Task和Thread有参无参,有、无返回值,的28种调用方式汇总——附C#源码

多线程之旅(8)_Task的异常捕获和处理方法——附C#源码

多线程之旅(9)_如何安全的取消正在执行的线程——附C#源码

多线程之旅(10)_QueueUserWorkItem和UnsafeQueueUserWorkItem的区别

多线程之旅(11)_如何限制系统线程池ThreadPool的最大最小并发数量_SetMaxThreads/SetMinThreads用法

多线程之旅(12)_聊聊线程池在系统内部运转的基本原理

本文主要是修正或补充上述文章中的一些问题:

修订1:

补充 以下两篇文章中的知识点:

多线程之旅(11)_如何限制系统线程池ThreadPool的最大最小并发数量_SetMaxThreads/SetMinThreads用法 

多线程之旅(2)_创建一个属于自己的精简线程池_线程调度策略——附C#源码

上述两篇文章分别讲了线程池和ThreadPool.SetMinThreads(*, *);的用法,改方法可以设置线程池中最小线程数量,但是没有说明具体应用场景。

我们在生产环境中使用线程池时,会发现一个问题,在默认情况下虽然我们使用了线程池,设置了线程池并发数量,但是从线程池创建线程的过程十分缓慢。

比如我们设置线程池中并发数量为20,实际情况是,可能从第5个线程开始,程序每1s创建一个新线程,直到并发数量达到20个才停下来。从逻辑上说是没有问题的,因为此时系统中并发的线程确实达到了20个。但假如我们有1000个线程,每个线程实际执行时间只有0.001秒,1000个线程总执行时间为1s,然而将这1000个线程创建出来,则需要1000s,这种场景中线程池就没有意义了。

我们希望的场景是,当程序启动时,瞬间创建出20个线程,每当这20个线程有一个执行完成时,立刻创建出一个新的线程补上,而不再有时间间隔。这种情况下1000个线程总执行时间大约就在1s左右。

基于上述这个场景,我们就可以使用ThreadPool.SetMinThreads(*, *)来达到这个目的。

相关测试比较代码见GitHub地址:https://github.com/yangwohenmai/TEST/tree/master/TaskSchedulerTest

Socket长连接、短连接使用方法——附C#源码

Socket高并发出现TIME_WAIT的原因以及解决办法

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
linux c 多线程执行顺序解析
Javascript与多线程
基于多线程任务队列执行时间测试——泛型单例模式落地
新手一看就懂的线程池!
【C++ 多线程:线程池从设计到实现】
开源图书:《C++ 并发编程指南》|Linux.CN
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服