编写高质量代码改善C#程序的157个建议——建议76: 警惕线程的优先级
2015-08-19 15:31
441 查看
建议76: 警惕线程的优先级
线程在C#中有5个优先级:Highest、AboveNormal、Normal、BelowNormal和Lowest。讲到线程的优先级,就会涉及线程的调度。Windows系统是一个基于优先级的抢占式调度系统。在系统中,如果有一个线程的优先级较高,并且它正好处在就绪状态,系统总是会优先运行该线程。换句话说,高优先级的线程总是在系统调度算法中获取更多的CPU执行时间。
我们可以在一个单CPU系统中测试下面的代码:
结果我们会发现,如果这段程序运行在单核计算机中,优先级为Highest的线程t1,其输出值几乎总是会大于优先级为Normal(默认)的线程t2。
在C#中,使用Thread和ThreadPool新起的线程,默认优先级都是Normal。虽然可以像上面的示例那样去修改线程的优先级,但是一般不建议这样做。当然,如果是一些非常关键的线程,我们还是可以提升线程的优先级的。这些关键线程应当具有运行时间短、能即刻进入等待状态等特征。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
线程在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个建议》陆敏技
相关文章推荐
- 编写高质量代码改善C#程序的157个建议——建议75:警惕线程不会立即启动
- C#程序中调用cmd执行命令
- 编写高质量代码改善C#程序的157个建议——建议74:警惕线程的IsBackground
- 编写高质量代码改善C#程序的157个建议——建议73:避免锁定不恰当的同步对象
- C#中的“静态”
- C#中的“静态”
- C#单例模式的三种写法
- C# Tostring 格式化输出字符串全解
- C#创建Windows Service(Windows 服务)基础教程
- C#基础--运算符及条件控制语句
- C# 发送16进制串口数据
- 编写高质量代码改善C#程序的157个建议——建议72:在线程同步中使用信号量
- C#调用默认浏览器打开网页的几种方法
- 编写高质量代码改善C#程序的157个建议——建议71:区分异步和多线程应用场景
- C#实现简易的加密、解密字符串工具类实例
- c#调用Excel绘制图表
- C# 调用window api大全
- Sublime Text 2 插件安装和Vim 模式设置写C#
- gsoap调用C#开发的WebService
- C#调用Web Service时的身份验证