通过包装非托管纤程 api 为 .net 实现代码协同

通过包装非托管纤程 api 为 .net 实现代码协同

ID:1341353

大小:83.00 KB

页数:11页

时间:2017-11-10

通过包装非托管纤程 api 为 .net 实现代码协同_第1页
通过包装非托管纤程 api 为 .net 实现代码协同_第2页
通过包装非托管纤程 api 为 .net 实现代码协同_第3页
通过包装非托管纤程 api 为 .net 实现代码协同_第4页
通过包装非托管纤程 api 为 .net 实现代码协同_第5页
资源描述:

《通过包装非托管纤程 api 为 .net 实现代码协同》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、通过包装非托管纤程API为.NET实现代码协同发布日期:12/31/2004

2、更新日期:12/31/2004AjaiShankar本文假设您熟悉托管C++和.NET下载本文的代码:CoroutinesinNET.exe(135KB)摘要代码协同是很多编程语言(包括CLU、Scheme、Python、Ruby和ICON)的一种强大功能。代码协同可以节省处理器开销并减少冗余,因为通过它们可以中途停止过程的执行,返回值,然后恰好从该过程停止执行的位置继续执行。本文说明了如何通过使用纤程API和C++的托管扩展为.N

3、ETFramework实现代码协同,以及如何容易地将它们与其他兼容.NET的语言一起使用。本文还说明了如何老练地使用运行库宿主以便在单个OS线程中运行多个托管线程。本页内容代码协同和.NETFramework纤程和线程实现详细信息生成器和树匹配示例小结纤程—可以从32位版本的Windows®中使用的轻量级线程处理对象—在很多方案中都很有用。由于线程是宝贵资源,因此您有时不希望将整个OS线程专门用于执行简单的任务。通过纤程,可以比线程更严密地控制任务的调度,因为是您而不是OS负责管理它们。由于它们具有较少的开销

4、,因此当您切换上下文时,它们还更加快速。此外,因为是由您控制纤程,所以对于它们而言,通常可以更容易地跟踪同步问题。代码协同是一个类似于纤程的、基于代码的概念,它已经在多个现代语言(如CLU、Scheme、Python、Ruby和ICON)中实现。简单说来,代码协同是一种方法,它可以在执行过程中停止并且向调用方提供值,而无须返回程序流。由于代码协同和纤程是并行的概念,因此它们两个可以相互补充。在Microsoft®.NETFramework下面,当前未以本机方式实现代码协同。(有关方面计划在将来发布C#版本。)

5、但是,通过一点儿聪明的涉及到Win32?纤程API和C++的托管扩展的编码工作,可以现在创建自己的代码协同库并且充分利用这一高级编程概念。可以将代码协同视为具有以下特点的方法:它们不返回到调用方,而是在处理中途停止执行,并且向调用方输出一个值。代码协同下一次被调用时,将从它上次停止执行的位置继续执行,直到输出另外一个值。例如,下面是一个对数组元素进行循环访问的小程序,它没有使用代码协同:classIter{publicobjectNext(){returnarray[ndx++];}object[]array

6、=newobject[]{1,2,3,4};intndx;}该代码循环访问的数组以及该数组的当前索引都是Iter类的字段。Next方法返回数组的下一个元素。如果语言支持代码协同,则可以按如下方式编写相同的程序:classCorIter{publicvoidNext(){object[]array=newobject[]{1,2,3,4};for(intndx=0;true;++ndx)Yield(arr[ndx]);}}这里需要注意的是,每当Next方法被调用时,它不是返回,而是保存它的当前执行状态(局部变量

7、,如array、ndx,以及下一条中间语言指令),并且调用Yield向调用方提供数组的下一个元素。该方法第一次被调用时,索引为0,并且函数输出数组的第一个元素。当该方法随后被调用时,将从它上次停止执行的位置继续执行,递增索引并输出下一个元素。在这样一个价值不大的示例中,代码协同实际上并没有完成什么工作。但是,如果需要编写一个对二进制树进行顺序遍历的递归方法,以便逐个返回节点,会怎样呢?如果没有代码协同,这将很难实现。您或者必须手动移除递归并编写一个与C++标准模板库中类似的迭代程序,或者需要在遇到每个节点时求

8、助于使用回调。这两种选择都为程序员带来了负担。此外,第一种选择为实现迭代程序的编码者造成了更多的工作,而回调选择则给用户带来了它自己的问题。代码协同在语言中的出现是上述两种选择的一种方便的替代选择,因为通过它们可以在遇到节点时输出节点。在StreamliningDOMXMLprocessingwithPython,您可以看到代码协同的类似用法—使用代码协同处理XMLDOM。Netscape(http://state-threads.sourceforge.net)中的StateThreads库用C并通过set

9、jmp和longjmp调用实现了代码协同。这两个代码协同示例还说明了Python生成器的概念:它们在被调用时将输出数组或二进制树的下一个值。使用代码协同,可以从C#内部通过简单的foreach语句枚举二进制树的节点:foreach(Nodenodeintree){//processthenode}代码协同的真正优点之一是,如果认为不需要进行其余计算,则可以中止代码协同。例如,为了了解两棵树是否按照相

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。