分享

C#多线程之旅

 紫殿 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的原因以及解决办法

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多