线程(一):基本概念
什么是线程?
- 线程是操作系统中能够独立运行的最小单位,也是程序能够并发执行的一段指令序列
- 它是进程的一部分,一个进程可以包含多个线程,这些线程共享进程资源
- 进程有入口线程,也可以创建更多的线程
为什么要用多线程?
1.批量重复任务希望同时执行
2.多个不同任务希望同时执行,互不干扰
什么是线程池
- 一组预先创建的线程,可以被重复用来执行多个任务
- 避免了重复创建和销毁,减少了开销,提升了性能和效率
- 异步编程默认使用线程池
什么是线程安全
线程安全:多个线程访问共享资源时,对共享资源的访问不会导致数据不一致或不可预期的结果
什么是同步机制
1.用于协调和控制多线程之间执行顺序和互斥访问共享资源
2.确保线程按照特定的顺序执行,避免竞争和数据不一致的问题
什么是原子操作
1.在执行过程中不会被中断的操作,不可分割,要么完全执行,要么完全不执行
2.在多线程环境下,原子操作能够保证数据的一致性和可靠性,避免出现竟态和数据竞争的问题
常用的实现方式
线程
线程池
异步编程
自带方法
1.Parallet:for forEach, Invoke
2.PLinq:AsParallet, AsSequential, AsOrdered
线程的创建:
- 创建Thread实例,并传入ThreadStart委托,还可以配置线程,是否为后台线程等[后台线程发现前台线程关闭,则也会关闭,前台线程则不会]
- 调用Thread.Start方法,还可以传参
线程的终止:
- 调用Thread.join方法,等待线程的结束
- 调用Thread.Interrupt方法,中断线程的执行
- 不能用Abort:推荐使用Thread.Interrupt或者CancellationToken
线程的挂起和恢复:
- Thread.Suspend及ThreadResume
- 新版本已标记为Obsolete
- 推荐使用锁,信号量等方式实现这一逻辑
线程安全和同步机制
- 原子操作:interlocked
- 锁和信号量: lock & Monitor
Mutex
Semaphore
WaitHandle:ManualResetEvent,AutoResetEvent
ReaderWriterLock
轻量型:
1.SemaphoreSlim
3. M:anualResetEventSlim
4. ReaderWriterLockSlim
不要自己造轮子
- 线程安全的单例:Lazy
- 线程安全的集合类型:ConcurrentBag, ConcurrentStack, ConcurrentQueue, ConcurrentDictionary 对于这些集合,直接放置,取时用try**获得值,是安全的.代替老旧的套路lock(object){}
- 阻塞集合: BlockingCollection
- 通道:Channel
- 原子操作:Interlocked
- 周期任务:PeriodicTimer