国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

淺談 C# 中的代碼協同 (Coroutine) 執行支持

淺談 C# 中的代碼協同 (Coroutine) 執行支持

更新時間:2022-04-27 文章作者:未知 信息來源:網絡 閱讀次數:

幾個月前我曾大致分析過 C# 2.0 中 iterator block 機制的實現原理,《C# 2.0 中Iterators的改進與實現原理淺析》,文中簡要介紹了 C# 2.0 是如何在不修改 CLR 的前提下由編譯器,通過有限狀態機來實現 iterator block 中 yield 關鍵字。
實際上,這一機制的最終目的是提供一個代碼協同執行的支持機制。
以下內容為程序代碼:


using System.Collections.Generic;

public class Tokens : IEnumerable<string>
{
public IEnumerator<string> GetEnumerator()
{
for(int i = 0; i<elements.Length; i++)
yield elements[i];
}
...
}

foreach (string item in new Tokens())
{
Console.WriteLine(item);
}



在這段代碼執行過程中,foreach 的循環體和 GetEnumerator 函數體實際上是在同一個線程中交替執行的。這是一種介于線程和順序執行之間的協同執行模式,之所以稱之為協同(Coroutine),是因為同時執行的多個代碼塊之間的調度是由邏輯隱式協同完成的。順序執行無所謂并行性,而線程往往是由系統調度程序強制性搶先切換,相對來說Win3.x 中的獨占式多任務倒是與協同模型比較類似。
就協同執行而言,從功能上可以分為行為、控制兩部分,控制又可進一步細分為控制邏輯和控制狀態。行為對應著如何處理目標對象,如上述代碼中:行為就是將目標對象打印到控制臺;控制則是如何遍歷這個 elements 數組,可進一步細分為控制邏輯(順序遍歷)和控制狀態(當前遍歷到哪個元素)。下面將按照這個邏輯介紹不同語言中如何實現和模擬這些邏輯。

Spark Gray 在其 blog 上有一個系列文章介紹了協同執行的一些概念。

Iterators in Ruby (Part - 1)
Warming up to using Iterators (Part 2)

文章第 1, 2 部分以 Ruby 語言(語法類似 Python)介紹了 Iterator 機制是如何簡化遍歷操作的代碼。實際上中心思想就是將行為與控制分離,由語言層面的支持來降低控制代碼的薄記工作。
以下內容為程序代碼:

def textfiles(dir)
Dir.chdir(dir)

Dir["*"].each do |entry|
yield dir+"\"+entry if /^.*.txt$/ =~ entry

if FileTest.directory?(entry)
textfiles(entry){|file| yield dir+"\"+file}
end
end
Dir.chdir(".."[img]/images/wink.gif[/img]
end

textfiles(“c:\”){|file|
puts file
}



例如上面這段 Ruby 的遞歸目錄處理代碼中,就采用了與 C# 2.0 中完全類似的語法實現協同執行支持。

對 C# 1.0 和 C++ 這類不支持協同執行的語言,協同執行過程中的狀態遷移或者說執行緒的調度工作,需要由庫和使用者自行實現,例如 STL 中的迭代器 (iterator) 自身必須保存了與遍歷容器相關的位置信息。例如在 STL 中實現協同執行:
以下內容為程序代碼:

#include <vector>
#include <algorithm>
#include <iostream>

// The function object multiplies an element by a Factor
template <class Type>
class MultValue
{
private:
Type Factor; // The value to multiply by
public:
// Constructor initializes the value to multiply by
MultValue ( const Type& _Val [img]/images/wink.gif[/img] : Factor ( _Val [img]/images/wink.gif[/img] {
}

// The function call for the element to be multiplied
void operator ( [img]/images/wink.gif[/img] ( Type& elem [img]/images/wink.gif[/img] const
{
elem *= Factor;
}
};

int main( [img]/images/wink.gif[/img]
{
using namespace std;

vector <int> v1;

//...

// Using for_each to multiply each element by a Factor
for_each ( v1.begin ( [img]/images/wink.gif[/img] , v1.end ( [img]/images/wink.gif[/img] , MultValue<int> ( -2 [img]/images/wink.gif[/img] [img]/images/wink.gif[/img];
}



雖然 STL 較為成功的通過迭代器、算法和謂詞,將此協同執行邏輯中的行為和控制分離,謂詞表現行為(MultValue<int>、迭代器(v1.being(), v1.end())表現控制狀態、算法表現控制邏輯(for_each),但仍然存在編寫復雜,使用麻煩,并且語義不連冠的問題。
一個緩解的方法是將謂詞的定義與控制部分合并到一起,就是類似 boost::Lambda 的實現思路:
以下內容為程序代碼:

for_each(v.begin(), v.end(), _1 = 1);

for_each(vp.begin(), vp.end(), cout << *_1 << ' ');



通過神奇的模板和宏,可以一定程度降低編寫獨立謂詞來定義行為的復雜度。但控制部分的狀態和邏輯還是需要單獨實現。

而 C# 1.0 中就干脆沒有自帶支持,必須通過《C# 2.0 中Iterators的改進與實現原理淺析》一文中所舉例子那樣笨拙的方式完成。
以下內容為程序代碼:

public class Tokens : IEnumerable
{
public string[] elements;

Tokens(string source, char[] delimiters)
{
// Parse the string into tokens:
elements = source.Split(delimiters);
}

public IEnumerator GetEnumerator()
{
return new TokenEnumerator(this);
}

// Inner class implements IEnumerator interface:
private class TokenEnumerator : IEnumerator
{
private int position = -1;
private Tokens t;

public TokenEnumerator(Tokens t)
{
this.t = t;
}

// Declare the MoveNext method required by IEnumerator:
public bool MoveNext()
{
if (position < t.elements.Length - 1)
{
position++;
return true;
}
else
{
return false;
}
}

// Declare the Reset method required by IEnumerator:
public void Reset()
{
position = -1;
}

// Declare the Current property required by IEnumerator:
public object Current
{
get // get_Current函數
{
return t.elements[position];
}
}
}
...
}



這種笨拙的 IEnumerable 接口實現方法,實際上是將 STL 中提供控制狀態的 iterator 完全自行實現,而且控制邏輯還限定于編寫 IEnumerable 接口實現時的定義。就算可以通過策略 (Strategy) 模式提供一定程度的定制,但其代碼邏輯過于分散,要理解一個簡單調用必須查看四五處分散的代碼。

好在牛人總是不缺的,呵呵。

Ajai Shankar 在 MSDN 上一篇非常出色的文章,COROUTINES Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API,里面通過 Win32 API 的纖程 (Fiber) 支持和 CLR 幾個底層 API 的支持,完整的實現了一套可用的協同執行支持機制。
Spark Gray 的第 4 篇文章中就詳細討論了這種實現方式的利弊:

SICP, Fiber api and ITERATORS !(Part 4)

纖程 Fiber 是 Win32 子系統為了移植 Unix 下偽線程環境下的程序方便,而提供的一套輕量級并行執行機制,由程序代碼自行控制調度流程。
其使用方法很簡單,在某個線程中調用 ConvertThreadToFiber(Ex) 初始化纖程支持,然后調用 CreateFiber(Ex) 建立多個不同纖程,對新建的纖程和轉換時當前線程缺省纖程,都可以通過 SwitchToFiber 顯式進行調度。
以下內容為程序代碼:

static int array[3] = { 0, 1, 2 };

static int cur = 0;

VOID CALLBACK FiberProc(PVOID lpParameter)
{
for(int i=0; i<sizeof(array)/sizeof(array[0]); i++)
{
cur = array[i];

SwitchToFiber(lpParameter);
}
}

LPVOID fiberMain = ConvertThreadToFiber(NULL);

LPVOID fiberFor = CreateFiber(0, FiberProc, fiberMain);

while(cur >= 0)
{
std::cout << cur << std::endl;

SwitchToFiber(fiberFor);
}

DeleteFiber(fiberFor);



上述偽代碼是纖程使用的一個大概流程,可以看出實際上纖程跟上面 Ruby 和 C# 2.0 中的協同執行所需功能是非常符合的。而在實現上,纖程實際上是通過在同一線程堆棧中構造出不同的區域(ConvertThreadToFiber/CreateFiber),在 SwitchToFiber 函數中切換到指定區域,以此區域(纖程)的代碼和寄存器等環境執行,有點類似于 C 代碼庫中 longjmp 的概念。Netscape 提供的狀態線程庫 State Threads library 就是通過 longjmp 等機制模擬的類似功能。
而在 .NET 1.0/1.1 中要使用纖程,則還需要考慮對每個纖程的 Managed 環境構造,以及切換調度時的狀態管理等等。有興趣的朋友可以仔細閱讀上述兩篇精彩文章。
以下內容為程序代碼:

class CorIter : Fiber {
protected override void Run() {
object[] array = new object[] {1, 2, 3, 4};
for(int ndx = 0; true; ++ndx)
Yield(arr[ndx]);
}
}

Coroutine next = new CorIter();
Object o = next();



可以看到這個代碼已經非常類似 C# 2.0 中的語法了,只是要受到一些細節上的限制。

而 C# 2.0 中,大概是為了保障移植性,使用了將控制邏輯編譯成狀態機的方式實現,并由狀態機自動管理控制狀態。其原理我在《C# 2.0 中Iterators的改進與實現原理淺析》一文中已經大概分析過了,有興趣的朋友可以進一步閱讀 Spark Gray 的第 5 篇文章中的詳細分析。

Implementation of Iterators in C# 2.0 (Part 5)

以及 Matt Pietrek 的關于 Iterator 狀態機的分析文章

Fun with Iterators and state machines


而為了將行為與控制更緊密地綁定到一起,C# 2.0 也提供了類似 C++ 中 boost::lambda 機制的匿名方法支持。簡要的分析可以參考我以前的一篇文章《CLR 中匿名函數的實現原理淺析》,或者Spark Gray 的第 6 篇文章。

Implementation of Closures (Anonymous Methods) in C# 2.0 (Part 6)

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        欧美日韩亚洲不卡| 欧美一区二区视频观看视频| 在线观看日韩一区| 亚洲视频图片小说| 一本在线高清不卡dvd| 中文字幕av不卡| 91丨porny丨中文| 亚洲大尺度视频在线观看| 在线播放视频一区| 韩国理伦片一区二区三区在线播放| 精品91自产拍在线观看一区| 豆国产96在线|亚洲| 亚洲激情图片qvod| 在线综合亚洲欧美在线视频| 国产传媒欧美日韩成人| 一区二区在线免费观看| 日韩精品一区二区三区在线| 国产高清不卡一区| 一区二区三区日韩欧美精品| 日韩精品影音先锋| 成人久久久精品乱码一区二区三区| 亚洲免费色视频| 精品国产99国产精品| 97成人超碰视| 九九国产精品视频| 亚洲国产另类精品专区| 久久久蜜桃精品| 欧美日韩国产首页| 成人精品国产一区二区4080| 日韩精品免费专区| 国产精品久久777777| 正在播放亚洲一区| 91在线视频网址| 国产一区二区在线观看视频| 天堂久久久久va久久久久| 欧美激情中文不卡| 日韩欧美一二区| 欧美日韩精品福利| 日本韩国欧美在线| proumb性欧美在线观看| 国产专区欧美精品| 日本麻豆一区二区三区视频| 亚洲资源在线观看| 国产精品久久久久9999吃药| 久久嫩草精品久久久精品一| 欧美va天堂va视频va在线| 欧美日韩精品一区二区| 一本久久a久久精品亚洲| 不卡电影一区二区三区| 丁香亚洲综合激情啪啪综合| 国产大陆精品国产| 国产成人午夜视频| 风间由美一区二区三区在线观看 | 中文字幕亚洲欧美在线不卡| 久久免费视频色| 精品日韩一区二区| 日韩网站在线看片你懂的| 欧美精品色一区二区三区| 欧美午夜精品久久久久久孕妇| 色猫猫国产区一区二在线视频| a在线播放不卡| 91在线观看污| 在线观看日韩毛片| 欧美日韩日日夜夜| 制服丝袜中文字幕亚洲| 欧美一级搡bbbb搡bbbb| 精品黑人一区二区三区久久| 欧美成人精品福利| 久久综合狠狠综合久久综合88| 国产欧美日韩久久| 国产精品免费久久| 亚洲三级免费观看| 一区二区三区四区激情| 日韩精品电影一区亚洲| 麻豆传媒一区二区三区| 国产真实乱偷精品视频免| 国产一区二区在线观看免费| 成人国产亚洲欧美成人综合网| 99国产精品99久久久久久| 欧美综合一区二区| 91精品国产一区二区三区| 亚洲精品一区二区三区在线观看| 国产女同性恋一区二区| ...av二区三区久久精品| 亚洲精品免费看| 日本不卡视频在线观看| 国产高清不卡一区| 色哟哟日韩精品| 欧美刺激脚交jootjob| 欧美激情在线观看视频免费| 夜夜精品视频一区二区| 奇米精品一区二区三区四区| 国产成人精品免费在线| 欧美午夜电影在线播放| 欧美videos中文字幕| 亚洲乱码中文字幕综合| 激情综合色播五月| 91精品福利在线| 久久久久久一二三区| 亚洲专区一二三| 国产福利一区二区三区视频在线| 欧美伊人精品成人久久综合97 | 一区二区三区四区中文字幕| 欧美aⅴ一区二区三区视频| 成人一级片在线观看| 欧美日韩免费观看一区二区三区| 国产午夜亚洲精品理论片色戒| 亚洲美腿欧美偷拍| 国产一区欧美日韩| 欧美日韩国产天堂| 亚洲色图色小说| 国产福利91精品一区| 91麻豆精品国产91久久久| 亚洲视频图片小说| 国产一区二区三区在线观看免费视频| 精品视频999| 国产精品传媒入口麻豆| 久久99精品久久久| 欧美丰满高潮xxxx喷水动漫| 亚洲男人的天堂av| 成人激情免费视频| 色狠狠桃花综合| 午夜视频在线观看一区二区| 五月激情综合网| 欧美精选午夜久久久乱码6080| 国产亚洲精品精华液| 日韩成人午夜电影| 日本高清不卡aⅴ免费网站| 国产精品久久久久影院亚瑟| 狠狠网亚洲精品| 欧美一二三四在线| 日韩成人伦理电影在线观看| 欧美日韩国产美女| 午夜av电影一区| 欧美一区二区三区免费观看视频| 性欧美大战久久久久久久久| 欧美日本免费一区二区三区| 日欧美一区二区| 欧美日韩午夜在线视频| 无码av免费一区二区三区试看| 欧美日韩一区二区在线观看| 五月婷婷色综合| 日韩欧美一级精品久久| 久久国产精品72免费观看| 精品日韩av一区二区| 国产成人免费在线观看不卡| 国产精品伦理一区二区| 99久久久国产精品免费蜜臀| 亚洲精品一二三四区| 欧美日韩视频在线第一区 | 亚洲制服丝袜在线| 欧美日韩免费一区二区三区| 美国一区二区三区在线播放| 精品国产乱码久久久久久免费| 国产在线视频一区二区三区| 中文字幕巨乱亚洲| 色综合视频在线观看| 亚洲影视在线播放| 欧美高清性hdvideosex| 国产一区二区三区高清播放| 中文字幕日韩av资源站| 在线视频综合导航| 美女网站一区二区| 国产欧美日韩不卡| 欧美午夜精品免费| 加勒比av一区二区| 亚洲色欲色欲www| 日韩精品在线看片z| 91视频你懂的| 蜜桃视频一区二区三区在线观看| 欧美激情中文字幕| 欧美日韩精品是欧美日韩精品| 国产乱妇无码大片在线观看| 一区二区在线观看不卡| 精品伦理精品一区| 在线观看av不卡| 成人午夜在线免费| 日欧美一区二区| 亚洲三级在线看| 欧美精品一区二区三区高清aⅴ| 91女厕偷拍女厕偷拍高清| 看片网站欧美日韩| 亚洲主播在线播放| 国产精品美女久久久久av爽李琼| 日韩一区二区三区视频在线观看| 91一区二区三区在线播放| 久久精品国产**网站演员| 亚洲午夜成aⅴ人片| 国产精品高清亚洲| 精品国产一区二区三区四区四| 欧美无砖砖区免费| 99精品偷自拍| 成人深夜视频在线观看| 另类综合日韩欧美亚洲| 亚洲不卡av一区二区三区| 亚洲欧洲精品一区二区精品久久久| 久久亚洲春色中文字幕久久久| 欧美一区二区三区白人| 欧美日韩中文精品| 在线观看一区二区视频|