9

先日、友人と議論をしていました。純粋な Lua では、プリエンプティブなマルチタスキング システムを構築できないと言いました。次の理由により、彼はあなたができると主張しています。

C と Lua の両方に組み込みのスレッド ライブラリはありません [OP の注: まあ、Lua は技術的にはそうですが、私たちの目的には役に立ちません]。ほとんどが C(++) で記述されている Windows には、ゼロから構築されたプリエンプティブ マルチタスク機能があります。したがって、Lua でも同じことができるはずです。私が目にする大きな問題は、プリエンプティブ マルチタスキングが機能する主な方法 (私の知る限り) は、マネージャーが制御を取得し、次にどのコードを処理する必要があるかを判断するために使用する定期的な割り込みを生成することです。また、Lua にはそれができる機能はないと思います。

私の質問は、プリエンプティブなマルチタスクを可能にする純粋な Lua ライブラリを作成することは可能ですか?

4

3 に答える 3

9

Lua の正式なセマンティクス (yieldたとえば のセマンティクスなど) がなければ、なぜそれができないのかという鉄壁の議論を思いつくのは非常に困難ですが、それを行う方法がわかりません。(私は長い間形式的なセマンティクスを望んでいましたが、明らかに Roberto と lhf の方が優れた機能を持っています。)

Lua のプリエンプティブ マルチタスキングが必要な場合、純粋な Lua でそれを実行しようとさえしません。代わりに、20 年前にニュージャージーの標準 ML で初めて見た古いトリックを使用します。

  • 割り込みは、lua_State「現在のコルーチンがプリエンプトされました」というフラグを設定します。

  • すべてのループとすべての関数呼び出しでフラグをチェックし、必要に応じて生成するように VM を変更します。

このパッチは書きやすく、保守も簡単です。プリエンプトできない長時間実行される C 関数の問題は解決しませんが、その問題を解決しなければならない場合は、はるかに難しい領域に迷い込んでいます。 Lua レベルではなく、C レベルです。

于 2010-06-05T14:19:57.590 に答える
5

私が知っていることではありません。debug.sethookを使用してコルーチンに設定されたフックから譲ることができれば、それはほとんどばかげているほど単純ですが、機能しません。Cから設定されたCフック(lua_sethook)から譲歩することはできますが、それを正確に行うことができずとにかく純粋なLuaではありません。

たとえそれが可能であったとしても、それは本当の糸脱毛ではないでしょう。たとえば、すべてが同じオペレーティングシステムスレッド内で実行されます。フックはさまざまな要因(時間、おそらくメモリなど)を考慮に入れてから、譲歩するかどうかを決定します。次に、譲歩されたコルーチンは、次に実行する子コルーチンを決定します。また、フックをいつ呼び出すかを決定する必要があります。最も頻繁に行われるのはすべてのLua命令ですが、これにはパフォーマンスの低下が伴います。また、コルーチンがC関数を呼び出す場合、Luaには管轄権がありません。そのC呼び出しに時間がかかる場合、それについてできることは何もありません。

これがLua-Lメーリングリストの関連スレッドで、興味深いと思うかもしれません。

于 2010-06-05T04:00:45.870 に答える