十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
C#代码协同执行的支持机制

创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站建设、成都做网站、凤冈网络推广、微信小程序开发、凤冈网络营销、凤冈企业策划、凤冈品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供凤冈建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
几个月前我曾大致分析过 C# 2.0 中 iterator block 机制的实现原理,《C# 2.0 中Iterators的改进与实现原理浅析》,文中简要介绍了 C# 2.0 是如何在不修改 CLR 的前提下由编译器,通过有限状态机来实现 iterator block 中 yield 关键字。实际上,这一机制的最终目的是提供一个C#代码协同执行的支持机制。
- using System.Collections.Generic;
 - public class Tokens : IEnumerable
 - {
 - public IEnumerator
 GetEnumerator() - {
 - for(int i = 0; i
 ; i++) - yield elements[i];
 - }
 - }
 - foreach (string item in new Tokens())
 - {
 - Console.WriteLine(item);
 - }
 
在这段代码执行过程中,foreach 的循环体和 GetEnumerator 函数体实际上是在同一个线程中交替执行的。这是一种介于线程和顺序执行之间的协同执行模式,之所以称之为协同(Coroutine),是因为同时执行的多个代码块之间的调度是由逻辑隐式协同完成的。顺序执行无所谓并行性,而线程往往是由系统调度程序强制性抢先切换,相对来说Win3.x 中的独占式多任务倒是与协同模型比较类似。
就协同执行而言,从功能上可以分为行为、控制两部分,控制又可进一步细分为控制逻辑和控制状态。行为对应着如何处理目标对象,如上述代码中:行为就是将目标对象打印到控制台;控制则是如何遍历这个 elements 数组,可进一步细分为控制逻辑(顺序遍历)和控制状态(当前遍历到哪个元素)。下面将按照这个逻辑介绍不同语言中如何实现和模拟这些逻辑。
以 Ruby 语言(语法类似 Python)介绍了 Iterator 机制是如何简化遍历操作的代码。实际上中心思想就是将行为与控制分离,由语言层面的支持来降低控制代码的薄记工作。
- deftextfiles(dir)
 - Dir.chdir(dir)
 - Dir["*"].eachdo|entry|
 - yielddir+"\"+entryif/^.*.txt$/=~entry
 - ifFileTest.directory?(entry)
 - textfiles(entry){|file|yielddir+"\"+file}
 - end
 - end
 - Dir.chdir("..")
 - end
 - textfiles(“c:\”){|file|
 - putsfile
 - }
 
例如上面这段 Ruby 的递归目录处理代码中,就采用了与 C# 2.0 中完全类似的语法实现协同执行支持。
对 C# 1.0 和 C++ 这类不支持协同执行的语言,协同执行过程中的状态迁移或者说执行绪的调度工作,需要由库和使用者自行实现,例如 STL 中的迭代器 (iterator) 自身必须保存了与遍历容器相关的位置信息。例如在 STL 中实现协同执行:
- #include
 - #include
 - #include
 - //ThefunctionobjectmultipliesanelementbyaFactor
 - template
 - classMultValue
 - {
 - private:
 - TypeFactor;//Thevaluetomultiplyby
 - public:
 - //Constructorinitializesthevaluetomultiplyby
 - MultValue(constType&_Val):Factor(_Val){
 - }
 - //Thefunctioncallfortheelementtobemultiplied
 - voidoperator()(Type&elem)const
 - {
 - elem*=Factor;
 - }
 - };
 - intmain()
 - {
 - usingnamespacestd;
 - vector
 v1; - //
 - //Usingfor_eachtomultiplyeachelementbyaFactor
 - for_each(v1.begin(),v1.end(),MultValue
 (-2)); - }
 
虽然 STL 较为成功的通过迭代器、算法和谓词,将此协同执行逻辑中的行为和控制分离,谓词表现行为(MultValue
【编辑推荐】