一.基本概念
1.什么是线程?
- 线程是操作系统中能独立运行的最小单位,也是程序中能并发执行的一段指令序列
- 线程是进程的一部分,一个进程可以包含多个线程,这些线程共享进程资源
- 进程有线程入口,也可以创建更多的线程
2.为什么要有多线程? - 批量重复任务希望同时进行(重复访问数组中的元素)
- 多个不同任务希望同时进行,互不打扰(多个线程需要做轮询操作)
3.什么是线程池? - 一组预设创建的线程,可以被重复使用来执行多个任务
- 避免频繁的创建和销毁线程,减少线程创建和销毁开销,提高系统性能和效率
- 异步编程默认使用线程池
4.什么是线程安全? - 线程安全:多个线程访问共享资源时,对共享资源的访问会导致数据不一致或者不可预期的结果。
- 同步机制:用于协调多个线程之间执行顺序和互斥访问共享资源,确保线程按照特定的顺序执行,避免竞态条件和数据不一致问题
- 原子操作:执行过程中不会被中断的操作,只能完全执行和完全不执行,不存在中间状态;多线程环境下,原子操作能保证数据的一致性和可靠性。
5.实现方式 - 线程:thread
- 线程池:threadpool
- 异步编程: async await
- 自带方法: Parallel(For、Foreach、Invoke)PLINQ(AsParallel、AsSequential、AsOrdered)
二:线程池
1.线程的创建
- 创建Thread实例,并传入ThreadStart委托—>还可以配置线程,如是否为后台线程(Deamon = true)
- 调用Thread.Start方法
2.线程终止 - 调用Thread.Join方法,等待线程结束
- 调用Thread.Interrupt方法,终端线程执行
3.线程的挂起与恢复 - thread.Suspend以及Thread.Resume
- 较新版本.NET中,这两个方法已经被标记为Obsolete,且调用会报错
- 推荐使用锁、信号灯方式实现这一逻辑
三:线程安全与同步机制 Thread-Safety
- 原子操作
- 锁与信号量
lock & Monitor
Mutex
Semaphore
WaitHandle
ManualResetEvent
AutoResetEvent
ReaderWriterLock - 轻量级
SemaphoreSlim
ManualResetEventSlim
ReaderWriterLockSlim - 不要自己造轮子
线程安全的单例:Lazy
线程安全的集合类型:ConcurrentBag、ConcurrentStack、ConcurrentQueue、ConcurrentDictionary
阻塞集合:BlockingCollection
通道:Channel
原子操作:Interlocked
周期任务:PeriodicTimer