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.循环等待条件
存在一个循环依赖链,使得每个进程都占有下一个进程所需的至少一种资源。

 

posted @   Darius丶段  阅读(203)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示