链接

精简详细: https://www.cnblogs.com/luxiaoxun/p/3280146.html
官网: https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread?redirectedfrom=MSDN&view=net-5.0
Event用法: https://www.cnblogs.com/chenwolong/p/AutoResetEvent.html
Semaphore用法: https://www.cnblogs.com/yifengjianbai/p/5468449.html
Mutex用法: https://www.cnblogs.com/nele/p/5534580.html

基础

  • 进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。
  • 前台线程和后台线程:通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。
  1. 普通Thread
    Thread t1 = new Thread(new ThreadStart(TestMethod)); //不带参数
    Thread t2 = new Thread(new ParameterizedThreadStart(TestMethod)); //带一个object参数
函数 注释
Start(); 启动线程
Suspend(); 挂起线程
Resume(); 挂起线程
Abort(); 打断线程
Join(); 其他线程挂起,等待线程完成后执行之后的逻辑 与Task的Wait()类似
  1. ThreadPool
    作用:为了减少Thread创建销毁的开销
    ThreadPool.QueueUserWorkItem(TestMethod, “Hello”); //创建并开启线程,可传入一个object参数

  2. AutoResetEvent和ManualResetEvent的使用:即信号量的使用
    Event用法: https://www.cnblogs.com/chenwolong/p/AutoResetEvent.html
    构造函数:参数:true:非阻塞(不阻塞线程),false:阻塞。
    区别:AutoResetEvent在每次WaitOne()后自动Reset()信号,而ManualResetEvent不会自动Reset()信号,需要手动Reset()

  3. Semaphore信号量:为了协调多个线程合理分配资源
    Semaphore用法: https://www.cnblogs.com/yifengjianbai/p/5468449.html

  4. Mutex互斥锁:同一时间只能有一个线程获取它
    Mutex用法: https://www.cnblogs.com/nele/p/5534580.html
    构造:new Mutex();
    申请:WaitOne();
    释放:ReleaseMutex();

  5. Monitor排他锁:
    通过Monitor.Enter() 和 Monitor.Exit()实现排它锁的获取和释放,获取之后独占资源,不允许其他线程访问
    lock()语法是简化版本理解为Monitor.Enter() 和 Monitor.Exit()的语法糖

  6. WaitHandle:以上线程同步操作的公共基类
    提供静态函数:WaitAll,WaitAny
    WaitAll:等待一组WaitHandle全部完成,
    WaitAny:等待一组WaitHandle中的一个完成,只要判断有完成的即结束等待,返回值:数组的索引,如没有执行完成的则返回-1