什么是线程

线程是操作系统中能够独立运行的最小单位,也是程序中能够并发执行的一段指令序列。
线程是进程的一部分,一个进程可以包含多个线程,这些线程共享进程的资源。
进程有入口线程,也可以创建更多的线程。

为什么要多线程

  1. 批量重复任务希望同时进行
  2. 多个不同任务希望同时进行

线程安全

多个线程访问共享资源时,对共享资源的访问不会导致数据不一致或不可预期的结果

同步机制

用于协调和控制多个线程之间执行顺序和互斥访问共享资源。
确保线程按照特定的顺序执行,避免竟态条件和数据不一致的问题。
可以使用lock()

原子操作

在执行过程中不会被中断的操作。不可分割,要么完全执行,要么完全不执行,没有中间状态。
使用Interlocked.Increment(ref count);实现增加操作

后台线程

当通过前台线程创建了后台线程,前台线程结束了,后台线程也会跟着结束。
而如果通过前台线程创建了前台线程,那即便前台线程结束了,创建的前台线程也不会结束。

线程的终止 Thread

  1. 推荐使用Thread.Interrupt或者CancellationTokenThread.Interrupt会抛出一个ThreadInterruptedException异常,直接用try catch来捕获该异常就好。但是如果线程太忙了,没有空闲处理来抛出异常的话,也是无法终止的。
  2. 调用Thread.Join方法等待线程结束,但是主线程会被阻塞,直到子线程结束
  3. 不能使用Abort方法!已经被遗弃了

线程安全与同步机制-锁与信号量

  • lock & Monitor, lock就是锁,底层是Monitor
  • Mutex,互斥锁,可以进程间共享
  • Semaphore,旗语,用于线程间的一个同步
  • WaitHandle
  • ReaderWriterLock

不要自己造轮子,dotnet提供了很多线程安全的操作

  1. 线程安全的单例:Lazy
  2. 线程安全的集合类型:ConcurrentBag/ConcurrentStack/ConcurrentQueue/ConcurrentDictionary
  3. 阻塞集合:BlockingCollection
  4. 通道:Channel
  5. 原子操作:Interlocked
  6. 周期任务:PeriodicTimer