.NET 线程池与同步机制详解
1. 线程池概述
在大多数操作系统中,创建和关闭线程的开销相对较大。如果需要执行一段较短的任务,比如提供一个网页服务或其他类似的简短操作,为该任务创建一个线程并在完成后关闭它并不是一个好主意,这存在两个严重问题:
- 启动和关闭线程的成本可能超过实际有用工作所消耗的资源。
- 随着更多任务的到来不断创建新线程,系统可能会因负载过重而变慢,大量线程会降低吞吐量。这是因为除了每个线程的基本开销(如栈所需的内存),操作系统需要在可运行线程之间定期切换,而这种切换也有开销。
为避免这些问题,.NET 提供了线程池。可以提供一个委托,运行时会在线程池中的某个线程上调用该委托。必要时会创建新线程,但会尽可能重用之前创建的线程。如果目前创建的所有线程都忙碌,任务会在队列中等待。方法执行完毕后,CLR 通常不会终止线程,而是让线程留在线程池中等待其他任务,以分摊创建线程的成本。线程池会尝试将线程数量保持在一个水平,使可运行线程的数量与硬件线程数量匹配,以最小化切换成本。
需要注意的是,线程池总是创建后台线程。如果进程中的最后一个前台线程退出时,线程池中的工作可能无法完成,因为此时所有后台线程都会被终止。若要确保线程池中的工作完成,必须在所有前台线程结束之前等待其完成。
2. 使用 Task 启动线程池工作
通常使用 Task 类来使用线程池,其基本用法很简单,示例如下:
Task.Run(() => MyThreadEntryPoint("https://oreilly.com/"))
超级会员免费看
订阅专栏 解锁全文

328

被折叠的 条评论
为什么被折叠?



