ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#多线程

2022-07-18 16:34:31  阅读:140  来源: 互联网

标签:异步 C# 访问 死锁 线程 多线程 资源


一、概念

  为防止一个应用程序占用CPU导致其他程序和操作系统长时间挂起,操作系统把物理计算单元分割为虚拟的进程,并赋予一定的计算能力。

  线程就是实现分割物理单元的方法。一个进程可以拥有多个线程。

二、多线程

  线程可以看做是虚拟的进程,用于独立运行指定的程序。而线程与线程之间的协作跟通信又成为我们不得不考虑的一个问题。这就牵扯到了

  多线程的概念。多线程有两个重要的概念:线程同步跟异步;

三、同步、异步

  同步:同一时间多个线程访问同一资源

  异步:访问资源的同时访问其他资源

  区别在于:同步的话就是相当于我去看病必须的排队,异步的话我可以先挂个号,我在等的时候可以去干其他的事。

  同步是线性,动作执行有先后顺序;异步则是非线性的,异步任务之间的执行没有固定的先后顺序,看CPU和任务优先级。

  判断线程之间是否同步的方法就是看是否使用同一把锁。

四、线程池

  为解决创建线程开销过大的问题,.NET通过System.Threading.ThreadPool类型提供了线程池方法,在线程池中,可以只花费极少的时间

  来完成创建大量的异步操作。线程池的用途主要是执行运行时间短的操作,否则会降低性能。

五、线程调度常用的方法

 1、通过构造函数创建

Task t = new Thread(()=>{...});//通过构造函数创建

Task.Run();                       //通过Run()直接创建,不带返回值

Task.Factory.StartNew();               

 

六、线程安全

  在多个线程同时访问莫资源的时候,任何对数据的访问都会影响到数据,甚至导致线程死锁,严重影响性能。

  为保证数据的有序访问,我们可以采用加锁的功能,用lock关键字锁定被访问的对象,该对象同一时间只能被一个进程占用,

  后续想要访问该对象的进程需要在后面排队,直至该对象被释放。

lock优点:保证了线程安全,缺点:牺牲了性能。

七、死锁

  当两个线程之间有对方想要的资源时,双方都在等对面先传出数据,各不退让,导致线程无法继续从而死锁。

  例子:兔子手里有草,但是得先拿到胡萝卜,而羊手里有胡萝卜,但是得先吃到草,你不给我,我也给不了你,一起死了。

  说白了死锁就是两个锁之间嵌套在一起,谁都不打开。

  产生死锁的必要条件:

1.互斥条件
某资源只能一个进(线)程使用,其他无法使用要进行等待,直到资源使用完毕释放资源

2.请求和保持
即资源请求者在请求其他资源时,保持对原有资源的占有,并不会释放自己所占有的资源

3.不可抢占
资源请求者不能强制从资源占有者那里抢夺资源,只能从等待资源占有者释放资源

4.循环等待条件
存在一个循环依赖链,使得每个进程都占有下一个进程所需的至少一种资源。

 

标签:异步,C#,访问,死锁,线程,多线程,资源
来源: https://www.cnblogs.com/Darius0821/p/16480563.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有