O / S Thread.Sleep(10)を実行せずに、協調型/非プリエンプティブなマルチタスクで歩留まりやスリープのデッドロックを回避するための創造的なアイデアはありますか?通常、yieldまたはsleep呼び出しは、他のタスクを実行するためにスケジューラーにコールバックします。しかし、これによりデッドロックが発生する場合があります。
いくつかの背景:
このアプリケーションにはスピードに対する大きなニーズがあり、これまでのところ、同じ業界の他のシステムと比較して非常に高速です。速度の手法の1つは、O / Sスレッドからのコンテキストスイッチのコストではなく、協調的/非プリエンプティブなスレッド化です。
高レベルは、優先度と処理時間に応じてタスクを呼び出す優先度マネージャーを設計します。各タスクは1回の「反復」作業を実行し、優先キューで再び順番を待つために戻ります。
非プリエンプティブスレッドのトリッキーなことは、特定のタスクを作業の途中で停止し、別のタスクからの他のイベントを待ってから続行する場合にどうするかです。
この場合、ABとCの3つのタスクがあります。ここで、AはBとCのアクティビティを同期する必要があるコントローラーです。最初に、AはBとCの両方を開始します。次に、Bが降伏するため、Cが呼び出されます。Cが降伏すると、Aは両方が非アクティブであることを確認し、Bを実行する時間であると判断しますが、Cの時間はまだ決定しません。さて、BはCと呼ばれる歩留まりで立ち往生しているので、実行することはできません。