C#线程理解

发布于:2025-09-12 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

一.线程类

1.基础线程类(Thread)

2.线程池类(Threadpool)

3.任务并行库(Task)

4.并行循环(Parallel)

二.线程池(threadPool)和Thread/Task之间的联系

1.ThreadPool和Thread的关系

2.ThreadPool和Task的关系

三.Thread和task的区别

1.抽象层次不同

2.资源消耗和效率

四.什么是操作系统资源/线程资源?

1.操作系统资源

2.线程资源

一.线程类

1.基础线程类(Thread)

Thread类:最基础的线程操作类,可以直接创建和控制单个线程。

特点:轻量级,但是创建和销毁成本比较高,适合长时间运行的任务。

使用场景:需要精细控制线程(如:优先级,长事件运行)

2.线程池类(Threadpool)

ThreadPool类:管理一个线程池,用于复用线程执行短期任务,减少线程创建销毁的开销。

特点:自动管理线程声明周期,适合大量短期任务。

使用场景:执行大量短期任务;

常用方法:

ThreadPool.QueueUserWorkItem(DoWork, "参数");
//将任务加入线程池队列
3.任务并行库(Task)

Task类:基于线程池的高级抽象,提供更灵活的任务管理和异步操作。

特点:支持任务调度,延续操作,取消机制,获取结果等功能。

Task是基于ThreadPool(或Thread)的高级封装,基本场景都适用

4.并行循环(Parallel)

Parallel类:提供简单的并行迭代功能(如:for,foreach)自动利用线程池。

Parallel.For(0, 100, i => ProcessItem(i));

二.线程池(threadPool)和Thread/Task之间的联系

1.ThreadPool和Thread的关系

1.ThreadPool是Thread的管理者

Thread是最底层的线程对象,直接对应操作系统的线程资源。而ThreadPool(线程池)是对Thread的封装和管理机制,它维护一个线程集合(“池”),当有任务需要执行时,会优先复用池中已存在的空闲线程,避免频繁创建和销毁Thread对象(这是一项昂贵的操作)。

2.threadPool对Thread的复用逻辑

当通过ThreadPool.QueueUserWorkItem()提交任务时,线程池会:

  • 若池中有空闲线程,直接分配该线程执行任务;

  • 若池中线程都在忙碌且未达最大线程数限制,会创建新的Thread加入池并执行任务;

  • 若达到最大限制,任务会进入队列等待,直到有线程空闲。

2.ThreadPool和Task的关系

1.Task是ThreadPool的高级接口

Task(任务并行库 TPL 的核心)是比ThreadPool更高层次的抽象,它默认基于ThreadPool实现(特殊情况除外,如TaskCreationOptions.LongRunning会直接创建新线程)。
简单说:Task.Run(...)new Task(...).Start()本质上是向线程池提交任务,由线程池中的Thread执行。

2.Task 对 ThreadPool 的扩展

  • ThreadPool仅提供简单的任务排队功能,而Task在此基础上增加了丰富的特性:

    • 任务返回值(Task<TResult>);

    • 任务延续(ContinueWith);

    • 取消机制(CancellationToken);

    • 异常处理(通过try/catch捕获任务内异常);

    • 父子任务关联等。

三.Thread和task的区别

1.抽象层次不同
  • Thread:是对操作系统线程的直接封装(1:1 映射),属于底层 API,直接操作线程资源。

  • Task:是基于线程池的高级抽象(.NET 4.0 引入的 TPL 任务并行库核心),不直接对应单个线程,而是表示一个 “待执行的工作单元”。

2.资源消耗和效率
  • Thread

    • 创建和销毁成本高(涉及操作系统内核对象操作)。

    • 每个Thread占用独立的栈空间(默认 1MB),大量创建可能导致内存压力。

    • 不适合频繁创建短期任务。

  • Task

  • 默认使用线程池中的线程(除非指定TaskCreationOptions.LongRunning),避免频繁创建新线程。

  • 资源消耗低,适合批量处理短期任务(如并行计算、IO 操作回调)。

  • 线程池会自动管理线程复用,效率更高

四.什么是操作系统资源/线程资源?

1.操作系统资源

指操作系统管理的所有硬件和软件资源的总称,是计算机系统运行的基础。线程本身也是操作系统资源的一种,其他常见的操作系统资源还包括:

  • 硬件资源:CPU、内存(物理内存、虚拟内存)、硬盘、网络接口、显卡等。

  • 软件资源:文件句柄(打开的文件)、网络连接(Socket)、进程、线程、互斥锁(Mutex)、信号量(Semaphore)等。

  • 操作系统通过内核(Kernel)统一管理这些资源,进程 / 线程需要通过系统调用(System Call)向内核申请或释放资源。

2.线程资源

是操作系统资源的一个子集,特指为线程运行所分配的系统资源,主要包括:

  • 线程内核对象:操作系统内核中记录线程状态的数据结构(如线程 ID、优先级、状态等)。

  • 线程栈:独立的内存区域(默认在 Windows 上为 1MB),用于存储线程执行时的局部变量、函数调用栈等。

  • 寄存器状态:CPU 寄存器中保存的线程执行上下文(如指令指针、栈指针等),用于线程切换时恢复执行状态。

简单说:一个线程(无论通过 C# 的Thread类创建,还是操作系统原生线程)本质上是操作系统分配的一组 “线程资源” 的集合

3.C#中Thread类和操作系统线程资源的关系

C# 中的Thread类是对操作系统线程资源的封装:

  • 当你创建new Thread(...)时,.NET 运行时会通过系统调用(如 Windows 的CreateThread)向操作系统申请线程资源

  • 操作系统内核会为其分配线程内核对象、栈空间等资源,并将线程加入调度队列。

  • 当调用Start()时,操作系统会调度该线程在 CPU 上执行

  • 当线程执行完毕或被销毁时,.NET 会释放对应的操作系统线程资源(归还给系统)。


网站公告

今日签到

点亮在社区的每一天
去签到