1

関数の実行中に現在のスタックへのポインターを設定し (後で取得する)、現在のスレッドを解放し (コール スタックをアンワインドせずに)、それをスレッド プールに戻すことはまったく可能ですか? そして、そのスレッドが中断したところから別のスレッドを取り上げますか? 関数を呼び出す人が現在のスレッド コンテキストが変更されたことを知らないことを意味することはわかっています。おそらく、このようなことを行うためにカスタム IL コードを記述する必要がありますが、これを行う方法はありますか?

4

2 に答える 2

8

いいえ、スタックはスレッドの状態の一部です。非同期ワークフローを使用してこのようなことを行うことはできますが (CCR を使用するとこれが簡単になります)、スレッドをスレッド プールに戻すことはできません。

これを行うスレッドプールを作成することもできますがそれは IMO の悪い考えです。これは、Application.DoEvents IMO を呼び出すのと同等のスレッドプールになります。

于 2009-02-02T17:15:37.620 に答える
5

あなたが説明しているのは、区切られた継続です。悲しいことに、CLR はこれをサポートしておらず、私が知っているトリックを使用してマネージ コード (混合コードでさえ) に実装することはできません。

現在、IronScheme でこの機能が必要です。CPS 変換を行うコンパイラを作成することにより、CLR でこの種の機能を作成する方法がありますが、相互運用性の問題が多数発生します (.NET 関数を直接呼び出すことができないなど)。

IronScheme で CPS 変換をいくつか試してみましたが、現在のコンパイラはこれにはあまり適しておらず、実行速度がかなり遅いです。

于 2009-02-15T20:54:17.697 に答える