一种多线程技术的定单模式_第1页
一种多线程技术的定单模式_第2页
一种多线程技术的定单模式_第3页
一种多线程技术的定单模式_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一种多线程技术的定单模式

0c#中的定单模式使用差分技术编程有两种主要方法。其中之一是,主线程独立于逻辑功能,主线程启动后不会干涉。其次,当主线程启动子线程时,必须使用子线程的处理结果(通常是多个子线程的处理结果)进行后续操作。这后一种方式又称为定单模式。其本质是实现多线程间前趋与后继次序关系的模式。本文将结合具体代码介绍在C#中,利用三种不同机制实现定单模式。首先是使用C#中的多线程同步机制,然后再应用通用类型系统所特有的委托,事件及异步委托功能分别实现定单模式。并对这三种实现机制的特点加以讨论。1基于三个线程的运行现在我们需要求解这样一个问题。给定两组数,先求出第一组的和、差,以及第二组数之积;再把得到的三个结果求积。我们假设这里的求和、求差和求积都是比较耗时的操作。为了提高程序执行效率,或者提高主线程的响应度,我们将分别用三个线程(前趋线程)做第一步操作,第四个线程(后继线程)做第二步。第四个线程需要用到前三个线程的运行结果,因而可以使用定单模式来协调这四个线程的关系。主线程用来启动各个线程。这里AddAsync类的对象(第一,第二线程在此对象中运行。)用以存储、计算第一组数的和、差。MultiAsync类的对象(第三线程在此对象中运行。)用以计算第二组数的积。GetResult类的对象(第四线程在此对象中运行。)用以取得前三线程的结果进行后续操作。(1)线程的执行角本成员变量ok数组用以标识前三个线程的运行结果现在是否可以使用。私有函数voidGetResultThread()用以生成线程委托,实际上是第四个线程的执行角本。我们可以清晰地看到这个函数只干了两件事:判断前三个线程是否出了结果,是,就是它们作后续处理;还没有,就令此线程睡眠等待结果出来。这里之所以在访问逻辑标志时加上GetResult类对象的锁,是因为此逻辑标志将要在AddAsync和MultiAsync类对象,也就是前三个线程里被修改,因此需要互斥。此外,线程同步机制wait,pulse要求在对象锁里使用。公共接口函数VoidResult()被主线程调用用以启动第四个线程。(2)和差回传的条件num1,num2两个实例变量用以存储第一组数。我们在AddAsync类的构造函数中把这两个数存进来。同时存进来的有AddAsync类所关联的GetResult类对象,我们正是通过这个对象把计算好的和差回传。AddThread()是用以生成第一,也就是求第一组数和线程的委托对象函数(即第一线程的执行角本)。我们看到这两个函数在算出结果后即刻把关联进来的getResult对象加锁,用以把计算结果回传给此对象的sum域,并唤醒第四个线程,告诉它sum值已经可用,让其检查其它线程是否也已经准备好,以便进行后续操作。For循环增加AddThread线程处理时间,延缓第一组数相加结果的出现,以检测作为前趋的三个线程与第四线程的交接机制。SubThread函数及MultiAsync类的MultiThread函数与AddThread类似,只不过执行的是第一组数求和及第二组数求积的操作,这里不再复述。(3)mc,puasyncGetResultgetResult=newGetResult();AddAsyncaddAsync=newAddAsync(getResult,100,200);MultiAsyncmultiAsync=newMultiAsync(getResult,100,200);addAsync.WorkStart();multiAsync.WorkStart();getResult.Result();(4)把前趋任务类及其类定义区分本文使用C#的线程同步机制来实现定单模式的思想即来源于此,但作了两个关键的改进。其一:原书中把获取结果和执行前趋任务的函数放在一个类中定义,这样固然可以简化编程,但由于在实际应用中,前趋任务往往有多个,且种类不同,因此需要用多个类来刻画描述这些任务,所以有必要把结果获取类和前趋任务类分开定义,这样可以灵活组合前趋任务执行,轻易实现各种应用逻辑。其二:把获取结果类的执行函数也变成一个与前趋任务线程同等地位的独立线程来执行,而不是在主线程中执行。这样可以不影响主线程的响应度,充分利用多线程的优点。2生成后趋任务的线程(1)在委托事件机制中,首先谈一下事件参数类AddEventArgs。事件参数类的作用在于暂存前趋任务线程的计算结果,并通过事件激发机制传递给后继线程。很显然它就相当于前趋线程发给后继线程的一封信,而送信人是委托事件对象eventResultEventHandlerresult。(2)GetResult(后继任务)对象不再关联进AddAsync,MultiAsync(前趋任务)对象中,取而代之的是委托事件对象,由它来作为前趋后继线程的联系人。并且在前趋线程的执行角本中把计算好的结果和当前操作类型打包进事件参数对象,激发事件,引发后继线程处理。(3)在GetResult类后继任务事件处理的线程中,根据事件参数把前趋任务计算的值GetResult类的相应域内,再去检测其它前趋线程是否完成,以便进行后续操作。(4)主线程中的调用这里特别关注一下①、②步的操作。正是它们把前趋线程的事件委托对象和后继线程的事件处理函数联系了起来。这种事件委托对象和事件处理函数的关联机制可以任意组合前趋线程与后继线程事件处理函数,从而可以轻易实现任何项目中要求的线程的逻辑关系。3模式2:地位式精细委托在C#中有一种神奇的机制—异步委托。一般意义上的委托是一个函数指针对象。当调用这个委托时,实际上是在当前线程中执行这个指针对象所指向的函数。而异步委托则由系统再自生出一个线程来执行这个函数指针对象,并且可以把委托函数的执行结果通过指定的回调函数取出来,由程序员自由使用。现在让我们看看由这种机制实现的定单模式。(1)线程的显示电路由于系统自动生成线程执行函数,我们在前趋线程脚本(AddAsync类的AddThread,SubThread函数和MutiAsync类的MultiThread函数)编写过程中没有使用生成线程委托,启动线程这种显示的多线程程序编写方式。完全是在把这些多线程函数当做普通函数来写。因而与前面两种实现方式完全不同的是在主函数中,将不再生成前趋线程类的对象,而是通过使用直接以两组数作为参数的类的静态函数。(2)调度波的获取在这个后继处理函数中通过IAsyncResult(异步结果接口)得到调用这个回调委托对象的异步委托,再从此异步委托中取出前趋线程的执行结果加以使用。(3)主函数中的调用4调度线程的编码是一种趋势多线程同步机制和事件委托机制分别实现定单模式的本质区别在于前趋线程和后继线程如何交接。线程同步机制事实上是一种询问机制,GetResult(结果查询)后继线程与前趋线程同时在处理器中运行。而事件委托机制则是在前趋线程在结果计算出来后通过激发事件把它传递给后继线程并引发其运行。这是通知机制,前趋线程与后继线程相继运行。也就是用查询方式和中断方式来处理IO操作的区别。异步委托机制处理前趋线程和后继线程交接的方式与事件委托类似,本质上都是通知机制。但与事件委托不同的是由系统自己生成线程执行前趋线程的角本,因而虽然是编写多线程程序,却完全可以按照普通单线程函数编写。程序本身可以简化,程序员的驰聘空间更大,更自由。sum,subtration,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论