正在阅读:.NET多线程编程(1):多任务和多线程.NET多线程编程(1):多任务和多线程

2005-07-01 10:27 出处: 作者:c-sharpcorner 责任编辑:moningfeng

  在有些操作系统里面,这两种调度策略都会用到。非抢占的调度策略在线程运行优先级一般时用到,而对于高优先级的线程调度则多采用抢占式的调度策略。如果你不确定系统采用的是那种调度策略,假设抢占的调度策略不可用是比较安全的。在设计应用程序的时候,我们认为那些占用CPU时间比较多的线程在一定的间隔是会释放CPU的控制权的,这时候系统会查看那些在等待队列里面的与当前运行的线程同一优先级或者更高的优先级的线程,而让这些线程得以使用CPU。如果系统找到一个这样的线程,就立即暂停当前执行的线程和激活满足条件的线程。如果没有找到同一优先级或更高级的线程,当前线程还继续占有CPU。当正在执行的线程想释放CPU的控制权给一个低优先级的线程,当前线程就转入睡眠状态而让低优先级的线程占有CPU。

  在多处理器系统,操作系统会将这些独立的线程分配给不同的处理器执行,这样将会大大的加快程序的运行。线程执行的效率也会得到很大的提高,因为将线程的分时共享单处理器变成了分布式的多处理器执行。这种多处理器在三维建模和图形处理是非常有用的。


需要多线程吗

  我们发出了一个打印的命令,要求打印机进行打印任务,假设这时候计算机停止了响应而打印机还在工作,那岂不是我们的停止手上的事情就等着这慢速的打印机打印?所幸的是,这种情况不会发生,我们在打印机工作的时候还可以同时听音乐或者画图。因为我们使用了独立的多线程来执行这些任务。你可能会对多个用户同时访问数据库或者web服务器感到吃惊,他们是怎么工作的?这是因为为每个连接到数据库或者web服务器的用户建立了独立的线程来维护用户的状态。如果一个程序的运行有一定的顺序,这时候采用这种方式可能会出现问题,甚至导致整个程序崩溃。如果程序可以分成独立的不同的任务,使用多线程,即使某一部分任务失败了,对其他的也没有影响,不会导致整个程序崩溃。

  毫无疑问的是,编写多线程程序使得你有了一个利器可以驾奴非多线程的程序,但是多线程也可能成为一个负担或者需要不小的代价。如果使用的不当,会带来更多的坏处。如果一个程序有很多的线程,那么其他程序的线程必然只能占用更少的CPU时间;而且大量的CPU时间是用于线程调度的;操作系统也需要足够的内存空间来维护每个线程的上下文信息;因此,大量的线程会降低系统的运行效率。因此,如果使用多线程的话,程序的多线程必须设计的很好,否则带来的好处将远小于坏处。因此使用多线程我们必须小心的处理这些线程的创建,调度和释放工作。


多线程程序设计提示

  有多种方法可以设计多线程的应用程序。正如后面的文章所示,我将给出详细的编程示例,通过这些例子,你将可以更好的理解多线程。线程可以有不同的优先级,举例子来说,在我们的应用程序里面,绘制图形或者做大量运算的同时要接受用户的输入,显然用户的输入需要得到第一时间的响应,而图形绘制或者运算则需要大量的时间,暂停一下问题不大,因此用户输入线程将需要高的悠闲级,而图形绘制或者运算低优先级即可。这些线程之间相互独立,相互不影响。

  在上面的例子中,图形绘制或者大量的运算显然是需要站用很多的CPU时间的,在这段时间,用户没有必要等着他们执行完毕再输入信息,因此我们将程序设计成独立的两个线程,一个负责用户的输入,一个负责处理那些耗时很长的任务。这将使得程序更加灵活,能够快速响应。同时也可以使得用户在运行的任何时候取消任务的可能。在这个绘制图形的例子中,程序应该始终负责接收系统发来的消息。如果由于程序忙于一个任务,有可能会导致屏幕变成空白,这显然需要我们的程序来处理这样的事件。所以我必须得有一个线程负责来处理这些消息,正如刚才所说的应该触发重画屏幕的工作。

  我们应该把握一个原则,对于那些对时间要求比较紧迫需要立即得到相应的任务,我们因该给予高的优先级,而其他的线程优先级应该低于她的优先级。侦听客户端请求的线程应该始终是高的优先级,对于一个与用户交互的用户界面的任务来说,它需要得到第一时间的响应,其优先级因该高优先级。
(待续...)
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品