C# Thread记录
链接
精简详细: 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类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。
- 普通Thread
Thread t1 = new Thread(new ThreadStart(TestMethod)); //不带参数
Thread t2 = new Thread(new ParameterizedThreadStart(TestMethod)); //带一个object参数
函数 | 注释 |
---|---|
Start(); | 启动线程 |
Suspend(); | 挂起线程 |
Resume(); | 挂起线程 |
Abort(); | 打断线程 |
Join(); | 其他线程挂起,等待线程完成后执行之后的逻辑 与Task的Wait()类似 |
ThreadPool
作用:为了减少Thread创建销毁的开销
ThreadPool.QueueUserWorkItem(TestMethod, “Hello”); //创建并开启线程,可传入一个object参数AutoResetEvent和ManualResetEvent的使用:即信号量的使用
Event用法: https://www.cnblogs.com/chenwolong/p/AutoResetEvent.html
构造函数:参数:true:非阻塞(不阻塞线程),false:阻塞。
区别:AutoResetEvent在每次WaitOne()后自动Reset()信号,而ManualResetEvent不会自动Reset()信号,需要手动Reset()Semaphore信号量:为了协调多个线程合理分配资源
Semaphore用法: https://www.cnblogs.com/yifengjianbai/p/5468449.htmlMutex互斥锁:同一时间只能有一个线程获取它
Mutex用法: https://www.cnblogs.com/nele/p/5534580.html
构造:new Mutex();
申请:WaitOne();
释放:ReleaseMutex();Monitor排他锁:
通过Monitor.Enter() 和 Monitor.Exit()实现排它锁的获取和释放,获取之后独占资源,不允许其他线程访问
lock()语法是简化版本理解为Monitor.Enter() 和 Monitor.Exit()的语法糖WaitHandle:以上线程同步操作的公共基类
提供静态函数:WaitAll,WaitAny
WaitAll:等待一组WaitHandle全部完成,
WaitAny:等待一组WaitHandle中的一个完成,只要判断有完成的即结束等待,返回值:数组的索引,如没有执行完成的则返回-1