task_scheduler_observer
[scheduler.task_scheduler_observer]
タスク・スケジュール・サービスにおけるスレッドの状態を表すクラス。
// <oneapi/tbb/task_scheduler_observer.h> ヘッダーで定義
namespace oneapi {
namespace tbb {
class task_scheduler_observer {
public:
task_scheduler_observer();
explicit task_scheduler_observer( task_arena& a );
virtual ~task_scheduler_observer();
void observe( bool state=true );
bool is_observing() const;
virtual void on_scheduler_entry( bool is_worker ) {}
virtual void on_scheduler_exit( bool is_worker } {}
};
} // namespace tbb
} // namespace oneapi
task_scheduler_observer
を使用すると、クライアントはグローバルまたは特定のタスク・スケジューラー領域で、スレッドがタスクの処理を開始および終了するタイミングを監視できます。.プログラマーは、task_scheduler_observer
からオブザーバークラスを派生させて、on_scheduler_entry
または on_scheduler_exit
仮想メソッドをオーバーライドできます。オブザーバー・インスタンスの監視を有効または無効にできます。作成時は無効です。observe()
を呼び出して監視を有効にすることを忘れないでください。
task_scheduler_observer
でオーバーライドされたメソッドでスローされ、キャッチされない例外の動作は未定義です。
メンバー関数
- task_scheduler_observer()
非アクティブ状態 (監視が無効) の
task_scheduler_observer
オブジェクトを構築します。オブザーバーを作成する場合、ワーカースレッドがオブザーバーを所数するスレッドに参加/離脱するたびに、開始/終了通知が行われます。オブザーバーがアクティブ化された時にスレッドが既にアリーナにある場合、最初にスチールされたタスクを実行する前にエントリー通知が呼び出されます。
- explicit task_scheduler_observer(task_arena&)
非アクティブ状態で特定のアリーナの
task_scheduler_observer
オブジェクトを構築します (監視は無効になります)。作成されたオブザーバーでは、スレッドがアリーナに参加/離脱するたびに、開始/終了が通知されます。オブザーバーがアクティブ化された時にスレッドが既にアリーナにある場合、最初にスチールされたタスクを実行する前にエントリー通知が呼び出されます。非アクティブ状態 (監視が無効) の
task_scheduler_observer
オブジェクトを構築します。このオブジェクトは、指定されたtask_arena
に出入りするスレッドから通知を受け取ります。
- ~task_scheduler_observer()
監視を無効にしてオブザーバー・インスタンスを破棄します。
on_scheduler_entry
およびon_scheduler_exit
の呼び出しが完了するまで待機します。
- void observe(bool state = true)
state
が true の場合は監視を有効にし、false の場合は監視を無効にします。
- bool is_observing() const
戻り値: 監視が有効な場合は true、それ以外は false を返します。
- virtual void on_scheduler_entry(bool is_worker)
タスク・スケジューラーは、スレッドが oneTBB ワークに参加する、または監視が有効になった後にアリーナに入るスレッドごとにこのメソッドを呼び出します。すでにタスクを実行しているスレッドでは、監視を有効にした後でスチールされた最初のタスクを実行する前に、このメソッドが呼び出されます。
スレッドが監視を有効にしてからタスクを生成する場合、そのタスクと生成されるすべてのタスクが、
on_scheduler_entry
を呼び出したスレッドで実行されることが保証されます。is_worker
フラグは、スレッドが oneTBB で作成された場合は true で、それ以外は false です。効果: デフォルトの動作は何もしません。
- virtual void on_scheduler_exit(bool is_worker)
タスク・スケジューラーは、スレッドがタスク処理への参加を停止するか、アリーナを離れる時にこのメソッドを呼び出します。
警告
プロセスは、ワーカースレッドがクリーンアップされるのを待たずに、
on_scheduler_exit
が呼び出される前に終了できます。効果: デフォルトの動作は何もしません。
例
次のサンプルは、oneTBB ワーカースレッドをハードウェア・スレッドに固定するオブザーバーのコードを示します。
class pinning_observer : public oneapi::tbb::task_scheduler_observer {
public:
affinity_mask_t m_mask; // HW affinity mask to be used for threads in an arena
pinning_observer( oneapi::tbb::task_arena &a, affinity_mask_t mask )
: oneapi::tbb::task_scheduler_observer(a), m_mask(mask) {
observe(true); // activate the observer
}
void on_scheduler_entry( bool worker ) override {
set_thread_affinity(oneapi::tbb::this_task_arena::current_thread_index(), m_mask);
}
void on_scheduler_exit( bool worker ) override {
restore_thread_affinity();
}
};