Thread时间和空间上的开销

  1. 空间开销(各个托管和非托管的dll)
    1. 内核数据结构
    2. 环境块
    3. 用户模式堆栈
      • 一个线程 分配 1M的堆栈空间,,【参数,局部变量】
    4. 内核模式堆栈
      • 在CLR的线程操作,包括线程同步,大多都是调用底层的win32 函数 ,用户模式的参数需要传递到内核模式。。。
  2. 空间上开销(teb,osthread结构, 堆栈)
    1. 我们进程启动的时候,会加载很多的dll [托管和非托管的], exe,资源,元数据
    2. 时间片切换
      • cpu核心数限制,如4个逻辑处理器,可供4个线程并行执行,运行5个线程时就会有一线程休眠30ms

Thread生命周期

  • Start,启动
  • Suspend,暂停
  • Resume,回复暂停的线程
  • Intterupt,中断,类似于continue
  • Abort,通过抛出异常的方式销毁一个线程
  • Join,等待线程结束

Thread的一些静态方法

一. 线程本地变量

  1. 数据槽
    AllocateDataSlot、AllocateNamedDataSlot、GetNamedDataSlot、FreeNamedDataSlot

    var slot = Thread.AllocateNamedDataSlot("username");
    Thread.SetData(slot, "hello world!!!");
    var obj = Thread.GetData(slot);
    Thread.FreeNamedDataSlot("username");
  2. ThreadStatic 特性 性能提升版

    他的值在每个线程中都是唯一的,即每个线程对static字段都会重新分配内存空间

    [ThreadStatic]
    static string username = string.Empty;
  3. ThreadLocal

    ThreadLocal<string> local = new ThreadLocal<string>();

二. 内存栅栏

  1. 多个线程操作一个共享变量,容易出问题

  2. 不要进行缓存,每次读取数据都是从memory内存中读取数据

MemoryBarrier、VolatileRead/Write

在此方法之前的内存写入都要及时从cpu cache中更新到memory

Thread.VolatileRead(ref isStop);

在此方法之后的内存读取都要从memory中读取,而不是cpu cache

无论处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值。

Thread与ThreadPool的区别

Thread:容易造成时间 + 空间开销,而且使用不当,容易造成线程过多,导致时间片切换。

ThreadPool: 控制能力比较弱。 做thread的延续,阻塞,取消,超时等等功能。控制权在CLR,而不是在我们这里。

  1. ThreadPool减少开启新线程消耗的资源,使用线程池中的空闲线程,不必在开启新线程,以及统一管理线程
  2. ThreadPoll性能优于Thread,但是Thread和ThreadPoll对线程的控制都不是很好,例如线程等待(线程执行一段时间无响应后,直接停止线程,释放资源 等 都没有直接的API来控制 只能通过硬编码来实现,同时ThreadPool使用的是线程池全局队列,全局队列中的线程依旧会存在竞争共享资源的情况,从而影响性能。

ThreadPool的定时功能

ThreadPool.RegisterWaitForSingleObject

 ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) =>
{
    //做逻辑判断,判断是否在否以时刻执行。。。
    Console.WriteLine("obj={0},tid={1}, datetime={2}", obj, 
                      Thread.CurrentThread.ManagedThreadId,DateTime.Now);
 }), "hello world", 1000, false);

Timer

  1. System.threading 下面有timer
  2. System.Timer 下面Timer
  3. System.Windows.Form 下面Timer
  4. System.Web.UI 下面Timer
ThreadPool.UnsafeQueueUserWorkItem(waitCallback, timer);//Timer 底层有底层有一个队列TimerQueue实现定时功能