多线程到底如何执行
由一个简单的例子来分析多线程的执行,先看看简单的例子,代码如下:
class Program { static int count = 0; static void Main(string[] args) { for (int i = 0; i < 10; i++) { Thread t = new Thread(Run); t.Name = i.ToString(); t.Start(); } Console.Read(); } static void Run() { ++count; Console.WriteLine("当前线程:{0},Count值为:{1}", Thread.CurrentThread.Name, count); }
程序在本机上的执行结果,如上图所示。
下面来分析下执行结果:
for循环依次开了十个线程,然后调用了线程的Start方法。Start方法在MSDN的摘要为:导致操作系统将当前实例的状态更改为 System.Threading.ThreadState.Running。要注意的是调用线程的Start方法,并不代表线程能马上启动起来(也许CPU正在忙其他的事情)。如何判断线程真的执行起来呢,只需要借助线程的IsAlive属性。
接下来,只根据上面的执行结果,看程序到底是如何跑的。
"线程0",启动,线程立刻进入执行状态,执行Run()方法,静态字段count加1,输出当前线程名称,以及Count值。
"线程1",启动,线程立刻进入执行状态,执行Run()方法,静态字段count加1,执行输出,没有完成输出。
"线程2",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,立即输出当前线程名称,以及Count值。
"线程1" 完成输出。
"线程3",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,立即输出当前线程名称,以及Count值。
"线程4",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,还未执行输出。
"线程5",启动,线程立刻进入执行状态。执行Run()方法,静态字段count加1,还未执行输出。
"线程4",完成执行输出。
"线程5",完成执行输出。
下面的结果就不分析了。
如何保证静态字段Count加一后,完成输出,下一个线程才能调用Run方法,也就是说Run方法,在当前线程执行完后,下一个线程才能执行。在实际编程中,这是经常会遇到的。
我知道的有两个方法(都是对临界资源进行加锁),第一个使用lock,第二个是借助于Monitor的Enter、Exit方法。两个方法都需要一个静态的Object对象,当做临界资源。代码如下:
static object lockObj = new object(); lock (lockObj) { ++count; Console.WriteLine("当前线程:{0},Count值为:{1}", Thread.CurrentThread.Name, count); }
static void Run() { Monitor.Enter(lockObj); ++count; Console.WriteLine("当前线程:{0},Count值为:{1}", Thread.CurrentThread.Name, count); Monitor.Exit(lockObj); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!