タスクの派生

task は抽象的な基本クラスであり、task::execute メソッドを必ずオーバーライドしなければなりません。execute メソッドは、タスクを実行するために必要なアクションを行ってから、実行する次のタスクを返すか、スケジューラーが実行する次のタスクを選択する場合は NULL を返します。NULL でない場合、返されるタスクは this のプレデセッサー・タスクの 1 つです。「タスクの再利用」セクションで説明されている再利用/再スケジュール・メソッドの 1 つが execute() メソッドの実行中に呼び出されなければ、this オブジェクトは execute メソッドがリターンした後、暗黙的に破棄されます。

コンストラクターによって割り当てられたリソースを解放する必要がある場合、仮想デストラクターをオーバーライドします。

「アフィニティー」セクションで説明されているように、note_affinity のオーバーライドは複数のタスクのキャッシュ再利用の効率を向上させます。

execute() の処理

スレッドがタスクの実行を開始することをスケジューラーが決定すると、次のステップを行います。

  1. execute() を呼び出してリターンするのを待ちます。
  2. タスクが recycle_* メソッドによって再利用するように表記されていない場合:
    1. タスクのデストラクターを呼び出します。
    2. タスクの parent が NULL でない場合、successor->refcount をアトミックにデクリメントし、ゼロになるとサクセサーをレディプールに格納します。
    3. 再使用のためにタスクのメモリーを解放します。
  3. タスクが再利用するように表記されている場合:
    1. recycle_to_reexecute (非推奨) によって表記されている場合、タスクをレディプールに戻します。
    2. その他の場合、recycle_as_child または recycle_as_continuation によって表記されています。

関連情報