重庆软件学院多线程在构建大型系统的时候是需要重点关注的一个重要方面,特别是在效率(系统跑得多快?)和性能(系统工作正常?)之间做一个权衡的时候。恰当的使用多线程可以极大的提高系统性能。 什么是线程? 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。 块线程模型(单线程多块模型sta) 这种模型里,一个程序里可能会包含多个执行的线程。在这里,每个线程被分为进程里一个单独的块。每个进程可以含有多个块,可以共享多个块中的数据。程序规定了每个块中线程的执行时间。所有的请求通过windows消息队列进行串行化,这样保证了每个时刻只能访问一个块,因而只有一个单独的进程可以在某一个时刻得到执行。这种模型比单线程模型的好处在于,可以响应同一时刻的多个用户请求的任务而不只是单个用户请求。但它的性能还不是很好,因为它使用了串行化的线程模型,任务是一个接一个得到执行的。
http://baike.baidu.com/view/3292182.htm 组合线程: 经常会出现需要组合多个线程的情况,就是当某个线程需要其他线程的结束来完成自己的任务。假设dummythread必须等待dummyprioritythread来完成自己的任务,我们只需要这样做:dummyprioritythread.join(); 暂停线程: 使得线程暂停给定的秒dummyprioritythread.sleep(<timeinsecond>); 多线程块模型(自由线程块模型) 多线程块模型(mta)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和sta的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证线程不会并发的请求相同的资源,因而导致竞争情况的发生。这里有必要提供一个锁机制。但是这样也许会导致系统死锁的发生。多线程在.net里如何工作? 执行线程: 使用threading命名空间里的start方法来运行线程:dummythread.start(); 中止线程: 如果需要中止线程可以使用如下的代码:dummyprioritythread.abort(); 同步 经常我们会遇到需要在线程间进行同步的情况,软件工程下面的代码给出了一些方法:usingsystem;usingsystem.threading;namespacesynchronizationthreadsexample{ classsynchronizationthreadsexample{ privateintcounter=0;staticvoidmain(){ synchronizationthreadsexampleste=newsynchronizationthreadsexample(); ste.threadfunction(); } publicvoidthreadfunction(){ threaddummythread=newthread(newthreadstart(somefunction); dummythread.isbackground=true; dummythread.name="firstthread"; dummythread.start(); console.writeline("startedthread{0}",dummythread.name); threaddummyprioritythread=newthread(newthreadstart(somefunction)); dummyprioritythread.isbackground=true; dummyprioritythread.name="secondthread"; dummyprioritythread.start(); console.writeline("startedthread{0}",dummyprioritythread.name); dummythread.join(); dummyprioritythread.join(); 软件学院 } publicvoidsomefunction(){ try{ while(counter<10){ inttempcounter=counter; tempcounter++; thread.sleep(1); counter=tempcounter; console.writeline("thread{0}.somefunction:{1}",thread.currentthread.name,counter); } } catch(threadinterruptedexceptionex){ console.writeline("exceptioninthread{0}",thread.currentthread.name); } finally{ console.writeline("thread{0}exiting.",thread.currentthread.name); } } }} 使用interlock c#提供了一个特殊的类叫做interlocked,就是提供了锁机制的实现,我们可以加入如下的代码实现锁机制:interlocked.somefunction(refcounter); 使用锁 这是为了锁定代码关键区域以进行同步,锁定代码如下:lock(this){somestatements;} 使用monitor 当有需要进行线程管理的时候我们可以使用:monitor.enter(this); 其他也有一些方法进行管理,这里就不一一提及了。线程的缺点线程自然也有缺点,以下列出了一些: 如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换; 什么是多线程? 多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。使用线程的好处有以下几点: 重庆足下软件教育 使用线程可以把占据长时间的程序中的任务放到后台去处理 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 还有其他很多使用多线程的好处,这里就不一一说明了。一些线程模型的背景 我们可以重点讨论一下在win32环境中常用的一些模型。 单线程模型 在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待当前的线程执行完。这种模型的缺点在于系统完成一个很小的任务都必须占用很长的时间。
posted on 2010-05-22 15:42
王晓玉 阅读(63)
评论(0) 编辑 收藏 引用