C#线程池使用全网知识点汇总

本文详细介绍了C#中的线程池使用,包括何时使用线程池、线程池的限制、最大线程数量管理、线程池与后台线程的关系,以及线程池在多核处理器环境中的应用。强调了线程池在批处理和服务器应用中的优势,并对比了线程池与BackgroundWorker的区别。同时,文章还讨论了线程同步的重要性及Lock关键字的使用。
摘要由CSDN通过智能技术生成

在C#编程语言中,使用线程池可以并行地处理工作,当强制线程和更新进度条时,会使用内建架构的ThreadPool类,为批处理使用多核结构。

在什么情况下使用线程池? 

    1.单个任务处理的时间比较短 
    2.需要处理的任务的数量大 

 

线程池(ThreadPool)使用起来很简单,但它有一些限制: 

1. 线程池中所有线程都是后台线程,如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线 程。 

2. 不能给入池的线程设置优先级或名称。 

3. 对于COM对象,入池的所有线程都是多线程单元(Multi-threaded apartment,MTA)线程。许多COM对象都需要单线程单元(Single -threaded apartment,STA)线程。 

4.入池的线程只能用于时间较短的任务。如果线程要一直运行(如Word的拼写检查器线程),就应使用Thread类创建一个线程。

 

线程池最多管理线程数量=“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000

通过线程池创建的线程默认为后台线程,优先级默认为Normal。

 

严格来讲,线程的系统开销很大。系统必须为线程分配并初始化一个线程内核对象,还必须为每个线程保留1mb的地址空间 (按需提交)用于线程的用户模式堆栈,分配12kb左右的地址空间用于线程的内核模式堆栈。然后,紧接着线程创建后,windows调 用进程中每个dll都有的一个函数来通知进程中所有的dll操作系统创建了一个新的线程。同样,销毁一个线程的开销也不小:进程 中的每个dll都要接收一个关于线程即将“死亡”的通知,而且内核对象及堆栈还需释放。


  如果一台计算机中只有一个cpu,那么在某一时刻只有一个线程可以运行。windows必须跟踪记录线程对象,而且是不停地跟 踪记录每个线程对象。windows不得不决定cpu下次调度哪个线程来执行。这个额外的代码不得不每隔20ms左右执行一次。windows使 cpu停止执行一个线程的代码,而开始执行另一个线程的代码的现象,我们称之为上下文切换(context switch)。上下文切换的开 销相当大,因为操作系统必须执行以下步骤:


  1. 进入内核模式。


  2. 将cpu的寄存器保存到当前正在执行的线程的内核对象中。x86架构的机器上cpu寄存器占了大约700字节的空间;x64架构 的机器上cpu寄存器占了大约1240字节的空间;而在ia64架构的机器上cpu寄存器占了大约2500字节的空间。


  3. 需要一个自旋锁(spin lock),确定下一次调度哪个线程,然后再释放该自旋锁。如果下一次调度的线程属于另一个进 程,那么此处的开销会更大,因为操作系统必切换到虚拟地址空间。


  4. 将即将运行的线程的内核对象的值加载到cpu寄存器中。


  5. 退出内核模式。


  所有上述内容都是纯粹的开销,导致windows操作系统和应用程序的执行速度比在单线程系统上的执行速度慢。
综合上述所有结果可得出以下结论:应尽可能地限制线程的使用。如果创建的线程越多,给操作系统带来的开销就越大,所 有的东西也就运行得越慢。另外,每个线程都需要资源(内核对象占用的内存及两个堆栈),所以每个线程都会消耗内存。


  线程还有另一个用途:可扩展性。当计算机有多个cpu时,windows能同时调度多个线程:每个cpu运行一个线程。


CLR线程池简介


  如前所述,创建并销毁一个线程在时间上的开销相当大。另外,线程多还会浪费内存资源,而且由于操作系统不得不在可运 行线程间进行调度和上下文切换,从而影响操作系统和应用程序的性能。为改进这种现象,clr中包含管理clr线程池的代码。我们 可以将线程池看作应用程序自己使用的线程的集合。每个进程都有一个线程池,这个线程池被该进程中的所有应用程序域共享。


  当clr初始化时,线程池中还没有任何线程。从内部实现上讲,线程池维护了一系列操作请求。应用程序希望执行一个异步 操作时,可以调用一些方法在线程池的队列中加入一个条目。线程池中的代码将从这个队列中提取出条目,并将该条目分派到线程 池中的线程。如果线程池中没有任何线程,就创建一个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@David Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值