趣味の通訳プロジェクトで、タスクの同期に関するパフォーマンス関連の質問についてアドバイスを求めています。スケジューラは、新しいグリーン タスクを実際のタスクにマップする必要があります。各タスクは、グリーン タスクの独自のリンク リストを保持します。
問題: グリーン タスクの追加を、実行中の実際のタスクに可能な限り最小限のオーバーヘッドで同期するにはどうすればよいですか? 以前のテストで、リンクされたリストを保護されたオブジェクトにすると、それ自体の実際のタスク内からのアクセスが非常に遅くなることがわかりました。現在、単一タスク バージョンでインタープリター ループがどの程度タイトであるかを把握するには、次のようにします。
while not Is_Empty (Global_State.GTasks) loop
Current_Task := Next (Global_State.GTasks);
Global_State.Pram (Current_Task.PC).all (Global_State, Current_Task);
Current_Task.PC := Current_Task.PC + 1;
Update (Global_State.GTasks, Current_Task);
end loop;
(更新はまだコピーされますが、後で削除できます。)
私のテストでは、このループに最小限の変更を加えるだけでも、解釈が大幅に遅くなる可能性があることが示されています。Global_State ではなく、GTasks がこのループを実行するタスクのローカル変数として存在すると想像してください。スケジューラーがこのループを実行するタスクの外部から新しい GTask を追加するときにのみ、GTask へのアクセスを同期する必要があります。
この状況であなたは何をお勧めしますか?