ブロッキング処理とシャットダウン処理
SPL には、オペレーター・処理要素を安全にブロックおよびシャットダウンするための関数が用意されています。
ブロッキングおよびシャットダウン処理は、関連する 2 つのトピックです。長期間のブロッキングは、シャットダウン処理を妨害することがあるため、よく問題になります。処理要素は、ランタイム・システムから終了するよう要求を受けると、タイミング良く連携して、内部に含まれる全オペレーターの終了を要求し、その要求が実現されるまで待機する必要があります。失敗した場合、結果として、その処理要素は強制終了されます。
安全にブロックできるよう、SPL は ProcessingElement クラスを通していくつかの関数を提供しています。 処理要素は、 オペレーターの実行を管理するコンテナーです。処理要素・オブジェクトに、 オペレーターの内部からアクセスするには、 Operator クラスの getPE() 関数を使用します。処理要素の提供するブロッキング関数は、以下のとおりです。
void blockUntilShutdownRequest() const;
bool blockUntilShutdownRequest(double const timeInSeconds) const;
bool blockUntilShutdownRequest(timespec const absoluteTime) const;
最初の関数は、シャットダウン要求が受け取られるまでブロックします。2 番目と 3 番目の関数は似ていますが、 指定された時間が経過したとき、または、絶対時間のデッドラインに達したときに、非ブロック処理を行います。これらの関数は、非ブロッキングがシャットダウン要求によるものであった場合に true を 返し、それ以外の場合には false を返します。 重要な点として、これらの関数のレゾリューションは限られており、オペレーティング・システムによって異なることに注意してください。 非常にわずかな時間のブロッキングが要求された場合、指定の時間よりも長くブロックしたり、指定のデッドラインを過ぎたりする可能性があります。
処理要素がシャットダウン要求を受け取ったかどうかを検査するために、処理要素オブジェクトによって提供される以下の関数を使用できます。
bool getShutdownRequested() const;
この関数は、シャットダウンが要求されるまでループを繰り返す、 ソース・オペレーター・ループの作成に特に便利です。