C#多线程
一、概念
为防止一个应用程序占用CPU导致其他程序和操作系统长时间挂起,操作系统把物理计算单元分割为虚拟的进程,并赋予一定的计算能力。
线程就是实现分割物理单元的方法。一个进程可以拥有多个线程。
二、多线程
线程可以看做是虚拟的进程,用于独立运行指定的程序。而线程与线程之间的协作跟通信又成为我们不得不考虑的一个问题。这就牵扯到了
多线程的概念。多线程有两个重要的概念:线程同步跟异步;
三、同步、异步
同步:同一时间多个线程访问同一资源
异步:访问资源的同时访问其他资源
区别在于:同步的话就是相当于我去看病必须的排队,异步的话我可以先挂个号,我在等的时候可以去干其他的事。
同步是线性,动作执行有先后顺序;异步则是非线性的,异步任务之间的执行没有固定的先后顺序,看CPU和任务优先级。
判断线程之间是否同步的方法就是看是否使用同一把锁。
四、线程池
为解决创建线程开销过大的问题,.NET通过System.Threading.ThreadPool类型提供了线程池方法,在线程池中,可以只花费极少的时间
来完成创建大量的异步操作。线程池的用途主要是执行运行时间短的操作,否则会降低性能。
五、线程调度常用的方法
1、通过构造函数创建
Thread thread = new Thread();//直接赋值
Thread thread = new Thread(()=>{}); //lambda表达式
//这个是Task任务
Task t = new Thread(()=>{...});//通过构造函数创建
Task.Run(); //通过Run()直接创建,不带返回值
Task.Factory.StartNew();
六、线程安全
在多个线程同时访问莫资源的时候,任何对数据的访问都会影响到数据,甚至导致线程死锁,严重影响性能。
为保证数据的有序访问,我们可以采用加锁的功能,用lock关键字锁定被访问的对象,该对象同一时间只能被一个进程占用,
后续想要访问该对象的进程需要在后面排队,直至该对象被释放。
lock优点:保证了线程安全,缺点:牺牲了性能。
七、死锁
当两个线程之间有对方想要的资源时,双方都在等对面先传出数据,各不退让,导致线程无法继续从而死锁。
例子:兔子手里有草,但是得先拿到胡萝卜,而羊手里有胡萝卜,但是得先吃到草,你不给我,我也给不了你,一起死了。
说白了死锁就是两个锁之间嵌套在一起,谁都不打开。
产生死锁的必要条件:
1.互斥条件
某资源只能一个进(线)程使用,其他无法使用要进行等待,直到资源使用完毕释放资源
2.请求和保持
即资源请求者在请求其他资源时,保持对原有资源的占有,并不会释放自己所占有的资源
3.不可抢占
资源请求者不能强制从资源占有者那里抢夺资源,只能从等待资源占有者释放资源
4.循环等待条件
存在一个循环依赖链,使得每个进程都占有下一个进程所需的至少一种资源。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异