通过包装非托管纤程_API_为_NET实现代码协同.docVIP

通过包装非托管纤程_API_为_NET实现代码协同.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
通过包装非托管纤程_API_为_NET实现代码协同

本文假设您熟悉托管 C++ 和 .NET 下载本文的代码: HYPERLINK /download/D/3/A/D3AC269E-A767-4DBB-B7F7-67DAA3E0A845/CoroutinesinNET.exe CoroutinesinNET.exe (135KB) 摘要 代码协同是很多编程语言(包括 CLU、Scheme、Python、Ruby 和 ICON)的一种强大功能。代码协同可以节省处理器开销并减少冗余,因为通过它们可以中途停止过程的执行,返回值,然后恰好从该过程停止执行的位置继续执行。 本文说明了如何通过使用纤程 API 和 C++ 的托管扩展为 .NET Framework 实现代码协同,以及如何容易地将它们与其他兼容 .NET 的语言一起使用。本文还说明了如何老练地使用运行库宿主以便在单个 OS 线程中运行多个托管线程。 本页内容 HYPERLINK /zh-cn/library/aa663647.aspx \l EHAA#EHAA 代码协同和 .NET Framework HYPERLINK /zh-cn/library/aa663647.aspx \l EGAA#EGAA 纤程和线程 HYPERLINK /zh-cn/library/aa663647.aspx \l EFAA#EFAA 实现详细信息 HYPERLINK /zh-cn/library/aa663647.aspx \l EEAA#EEAA 生成器和树匹配示例 HYPERLINK /zh-cn/library/aa663647.aspx \l EDAA#EDAA 小结 纤程 — 可以从 32 位版本的 Windows? 中使用的轻量级线程处理对象 — 在很多方案中都很有用。由于线程是宝贵资源,因此您有时不希望将整个 OS 线程专门用于执行简单的任务。通过纤程,可以比线程更严密地控制任务的调度,因为是您而不是 OS 负责管理它们。由于它们具有较少的开销,因此当您切换上下文时,它们还更加快速。此外,因为是由您控制纤程,所以对于它们而言,通常可以更容易地跟踪同步问题。 代码协同是一个类似于纤程的、基于代码的概念,它已经在多个现代语言(如 CLU、Scheme、Python、Ruby 和 ICON)中实现。简单说来,代码协同是一种方法,它可以在执行过程中停止并且向调用方提供值,而无须返回程序流。由于代码协同和纤程是并行的概念,因此它们两个可以相互补充。 在 Microsoft?.NET Framework 下面,当前未以本机方式实现代码协同。(有关方面计划在将来发布 C# 版本。)但是,通过一点儿聪明的涉及到 Win32? 纤程 API 和 C++ 的托管扩展的编码工作,可以现在创建自己的代码协同库并且充分利用这一高级编程概念。 可以将代码协同视为具有以下特点的方法:它们不返回到调用方,而是在处理中途停止执行,并且向调用方输出一个值。代码协同下一次被调用时,将从它上次停止执行的位置继续执行,直到输出另外一个值。例如,下面是一个对数组元素进行循环访问的小程序,它没有使用代码协同: class Iter { public object Next() { return array[ndx++]; } object[] array = new object[] {1, 2, 3, 4}; int ndx; } 该代码循环访问的数组以及该数组的当前索引都是 Iter 类的字段。Next 方法返回数组的下一个元素。如果语言支持代码协同,则可以按如下方式编写相同的程序: class CorIter { public void Next() { object[] array = new object[] {1, 2, 3, 4}; for(int ndx = 0; true; ++ndx) Yield(arr[ndx]); } } 这里需要注意的是,每当 Next 方法被调用时,它不是返回,而是保存它的当前执行状态(局部变量,如 array、ndx,以及下一条中间语言指令),并且调用 Yield 向调用方提供数组的下一个元素。该方法第一次被调用时,索引为 0,并且函数输出数组的第一个元素。当该方法随后被调用时,将从它上次停止执行的位置继续执行,递增索引并输出下一个元素。 在这样一个价值不大的示例中,代码协同实际上并没有完成什么工作。但是,如果需要编写一个对二进制树进行顺序遍历的递归方法,以便逐个返回节点,会怎样呢?如果没有代码协同,这将很难实现。您或者必须手动移除递归并编写一个与 C++ 标准模板库中类似的迭代程序,或

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档