C/C++ でのプリエンプティブマルチタスキング: 実行中のスレッドはタイマーによって中断され、タスクを切り替えることができますか?
グリーンスレッドなどを使用する多くの VM やその他の言語ランタイムは、これらの用語で実装されています。C/C++ アプリでも同じことができますか?
もしそうなら、どのように?
これはプラットフォームに依存するため、特定のプラットフォームでのサポートについて検討してください。SIGALRM
たとえば、 Linux のハンドラーで (おそらく ? を使用して) ある種の内部スタックを交換するためにできる魔法があればlongjmp
、それは素晴らしいことです!
気になったので質問します。
私は数年間、非同期 IO ループの作成に取り組んできました。非同期 IO ループを記述するときは、ループの DOS になるため、計算にコストのかかる計算をループに入れないように十分に注意する必要があります。
したがって、私は、非同期 IO ループを回復させたり、ある種のグリーン スレッドやそのようなアプローチを完全にサポートしたりするためのさまざまな方法に興味があります。たとえば、アクティブなタスクと a のループ反復回数をサンプリングし、SIGALRM
タスクがブロックされていることが検出された場合は、他のすべてのものを新しいスレッドに移動するか、これを巧妙に変更して目的の結果を得ることができます。
最近、この点に関して node.js に関するいくつかの不満がありました。他の場所で、Go やHaskellなどの他のランタイムに関する興味をそそるコメントを見てきました。しかし、C/C++ のシングル スレッドでプリエンプティブマルチタスクを実行できるかどうかという基本的な問題から離れすぎないようにしましょう。