0

monoを使用してC#のマイクロスレッドメッセージパッシングライブラリで作業しようとしています。Mono 2.4かそこら以来、明らかに継続(yieldではない)が「Mono.Tasklets」の下で利用可能になっています。ただし、これらには私が見つけることができるドキュメントがなく、それらの一般的な使用法は機能しますが、デバッガーが接続しないときどき(ただし再現可能な)クラッシュが発生します。

私の具体的な質問は次のとおりです。

Mark()関数とは何か、いつどこで呼び出す必要があるかを知っている人はいますか?これは1回限りの初期化のようですが、なぜそれがコンストラクターに含まれないのかわかりません。

複数の継続を使用することに制限はありますか?継続を別のスレッドに渡すことができないことを発見しましたが、複数の継続を保存して前後に切り替えることができるようですか?

4

1 に答える 1

2

LE:クラッシュの問題については、次の未解決のバグを参照してください:バグ566324バグ580791バグ602502

私自身はこれにかなり慣れていないので、これまでに収集した情報をここに示します。多分それは役に立つでしょう。

1)Mono.Taskletsライブラリ(Miguel de Icaza [READ:here ]で説明)は、さまざまな形式の継続システムと軽量(LW)スレッドを構築するために使用できる継続ライブラリです。

これを描写する簡単な方法は、Cのlongjmp / setjmpのモノバージョンであり、スタックを巻き戻すためにのみ使用できます。

ライブラリは当初、ある人によって開発されました[READ:here ]、そして今ではMonoに含まれ、文書化されています[READ:here ](これらのリンクをたどると詳細がわかります)

その男は、この抽象化の上にマイクロスレッディングライブラリを実装しました。そして今、それはMono.Taskletsフレームワークに移植されました

2)継続は、現在の実行状態を保存するために使用できるオブジェクトであり、後で保存された状態を復元するために使用できます。

ここでの「実行状態」とは、呼び出しスタックとローカル変数を含むスタック、およびプロセッサのレジスタを意味します。

保存された状態が復元されると、プログラムの実行は、すべてのローカル変数が復元された状態で、状態が保存された位置にジャンプして戻るように見えます。

Cでの例とウィキペディア/継続に関する詳細情報

3)APIは次のとおりです。

public class Continuation {
      public Continuation ();
      public void Mark ();
      public int Store (int state);
      public void Restore (int state);
 }

継続を使用して、マイクロスレッドを実装できます。Githubで入手可能なMono.MicroThreadsのコードを見ることができます[読む:ここ]

    public Continuation()
    {
        m_handle = alloc_continuation();
        Print("Continuation()");
    }

    public void Mark()
    {
        Print("Mark()");
        // skip 1 frame, ie. this function
        mark_continuation_frame(m_handle, 1);
    }

    public int Store(int data)
    {
        Print("Store({0})", data);
        int res = store_continuation(m_handle, data);
        Print("Store({0}) = {1}", data, res);
        return res;
    }

    public void Restore(int data)
    {
        Print("Restore({0})", data);
        restore_continuation(m_handle, data);
        Print("Restore() exit (NEVER REACHED)");
    }

ここに提示されているものから:

Mark()保存する最上位のフレームをマークするために使用されます

Store(x)は、現在の状態を継続に格納し、指定された整数xを返します。

Restore(y)は保存された状態を復元し、指​​定された整数yを返します。(Restoreに指定された整数yは、実際にはStore()メソッドから返されることに注意してください。これは、状態が復元された後の場所であるためです。)

static void Main()
{
 Continuation c = new Continuation();
 c.Mark();
 int foo = 123;
 int val = c.Store(0);
 Console.WriteLine("{0} {1}", val, foo);
 foo = 321;
 if (val < 5)
     c.Restore(val + 1);
}

Store()を呼び出すと、現在の実行状態が記録され、Restore()を呼び出すことでこの状態に戻ることができます。

Store()の呼び出し元は、Storeの結果に基づいて、それが初期ストアであるか復元ポイントであるかを通知します。

 var c = new Continuation ();
 ...

 switch (c.Store (0)){
 case 0:
      // First invocation
 case 1:
      // Restored from the point ahead.
 }
 ...
 // Jump back to the switch statement.
 c.Restore (1); 
于 2010-07-24T12:13:26.820 に答える