改善C#程序的157个建议(连载76)

发表于:2011-11-15 09:56

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  建议76:警惕线程的优先级

  线程在C#中有5个优先级:Highest、AboveNormal、Normal、BelowNormal和Lowest。讲到线程的优先级,就会涉及线程的调度。Windows系统是一个基于优先级的抢占式调度系统。在系统中,如果有一个线程的优先级较高,并且它正好处在就绪状态,系统总是会优先运行该线程。换句话说,高优先级的线程总是在系统调度算法中获取更多的CPU执行时间。

  我们可以在一个单CPU系统中测试下面的代码:

  • static void Main(string[] args)  
  • {  
  •     long t1Num = 0;  
  •     long t2Num = 0;  
  •     CancellationTokenSource cts = new CancellationTokenSource();  
  •       
  •     Thread t1 = new Thread(() => 
  •     {  
  •         while (true && !cts.Token.IsCancellationRequested)  
  •         {  
  •             t1Num++;  
  •         }  
  •     });  
  •     t1.IsBackground = true;  
  •     t1.Priority = ThreadPriority.Highest;  
  •     t1.Start();  
  •     Thread t2 = new Thread(() => 
  •     {  
  •         while (true && !cts.Token.IsCancellationRequested)  
  •         {  
  •             t2Num++;  
  •         }  
  •     });  
  •     t2.IsBackground = true;  
  •     t2.Start();  
  •       
  •     Console.ReadLine();  
  •     //停止线程  
  •     cts.Cancel();  
  •     Console.WriteLine("t1Num:" + t1Num.ToString());  
  •     Console.WriteLine("t2Num:" + t2Num.ToString());  
  • }
  •   结果我们会发现,如果这段程序运行在单核计算机中,优先级为Highest的线程t1,其输出值几乎总是会大于优先级为Normal(默认)的线程t2。

      在C#中,使用Thread和ThreadPool新起的线程,默认优先级都是Normal。虽然可以像上面的示例那样去修改线程的优先级,但是一般不建议这样做。当然,如果是一些非常关键的线程,我们还是可以提升线程的优先级的。这些关键线程应当具有运行时间短、能即刻进入等待状态等特征。

    相关链接:

    改善C#程序的157个建议(连载1)

    改善C#程序的157个建议(连载2)

    改善C#程序的157个建议(连载3)

    改善C#程序的157个建议(连载4)

    改善C#程序的157个建议(连载5)

    改善C#程序的157个建议(连载6)

    改善C#程序的157个建议(连载7)

    改善C#程序的157个建议(连载8)

    改善C#程序的157个建议(连载9)

    改善C#程序的157个建议(连载10)

    改善C#程序的157个建议(连载11)

    改善C#程序的157个建议(连载12)

    改善C#程序的157个建议(连载13)

    改善C#程序的157个建议(连载14)

    改善C#程序的157个建议(连载15)

    改善C#程序的157个建议(连载71)

    改善C#程序的157个建议(连载72)

    改善C#程序的157个建议(连载73)

    改善C#程序的157个建议(连载74)

    改善C#程序的157个建议(连载75)

    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号