什么是线程
线程是操作系统中能够独立运行的最小单位,也是程序中能够并发执行的一段指令序列。
线程是进程的一部分,一个进程可以包含多个线程,这些线程共享进程的资源。
进程有入口线程,也可以创建更多的线程。
为什么要多线程
- 批量重复任务希望同时进行
- 多个不同任务希望同时进行
线程安全
多个线程访问共享资源时,对共享资源的访问不会导致数据不一致或不可预期的结果
同步机制
用于协调和控制多个线程之间执行顺序和互斥访问共享资源。
确保线程按照特定的顺序执行,避免竟态条件和数据不一致的问题。
可以使用lock()
原子操作
在执行过程中不会被中断的操作。不可分割,要么完全执行,要么完全不执行,没有中间状态。
使用Interlocked.Increment(ref count);
实现增加操作
后台线程
当通过前台线程创建了后台线程,前台线程结束了,后台线程也会跟着结束。
而如果通过前台线程创建了前台线程,那即便前台线程结束了,创建的前台线程也不会结束。
线程的终止 Thread
- 推荐使用
Thread.Interrupt
或者CancellationToken
。Thread.Interrupt
会抛出一个ThreadInterruptedException
异常,直接用try catch
来捕获该异常就好。但是如果线程太忙了,没有空闲处理来抛出异常的话,也是无法终止的。 - 调用
Thread.Join
方法等待线程结束,但是主线程会被阻塞,直到子线程结束 - 不能使用
Abort
方法!已经被遗弃了
线程安全与同步机制-锁与信号量
- lock & Monitor, lock就是锁,底层是Monitor
- Mutex,互斥锁,可以进程间共享
- Semaphore,旗语,用于线程间的一个同步
- WaitHandle
- ReaderWriterLock
不要自己造轮子,dotnet提供了很多线程安全的操作
- 线程安全的单例:Lazy
- 线程安全的集合类型:ConcurrentBag/ConcurrentStack/ConcurrentQueue/ConcurrentDictionary
- 阻塞集合:BlockingCollection
- 通道:Channel
- 原子操作:Interlocked
- 周期任务:PeriodicTimer