ローカル・セマンティクスをサポートし、ワーカースレッドがタスク・スケジューラー領域に加わったときと離脱したときを監視するように、task_scheduler_observer クラスが拡張されました。 拡張前は、task_scheduler_observer は、ワーカースレッドがグローバル・タスク・スケジューラーに加わったときと終了したときのみ監視していました。
class task_scheduler_observer;
#define TBB_PREVIEW_LOCAL_OBSERVER 1 #include "tbb/task_scheduler_observer.h"
namespace tbb {
class task_scheduler_observer {
public:
task_scheduler_observer( bool local = false );
// ローカル・オブザーバーに関連しないメソッドは
// task_scheduler_observer を参照 ...
#if TBB_PREVIEW_TASK_ARENA
task_scheduler_observer( task_arena & a)
virtual bool on_scheduler_leaving() { return true; }
#endif
};
}
次の例は、ワーカースレッドをハードウェア・スレッドに関連付けて、ワーカーがスリープ状態にならないようにするオブザーバーのコードを示します。
class pinning_observer: public tbb::task_scheduler_observer {
public:
affinity_mask_t m_mask; // この領域で使用する HW アフィニティー・マスク
pinning_observer( affinity_mask_t mask ) : m_mask(mask) { }
pinning_observer( tbb::task_arena &a, affinity_mask_t mask )
: tbb::task_scheduler_observer(a), m_mask(mask) {
observe(true); // オブザーバーをアクティブ化
}
/* オーバーライド */ void on_scheduler_entry( bool worker ) {
set_thread_affinity(tbb::task_arena::current_slot(), m_mask);
}
/* オーバーライド */ bool on_scheduler_leaving( ) {
// false を返して領域のスレッドをトラップにかける
return /* bool */ !is_more_work_available_soon();
}
/* オーバーライド */ void on_scheduler_exit( bool worker ) { }
};
| メンバー | 説明 |
|---|---|
| task_scheduler_observer( bool local = false ) |
インアクティブ状態 (監視が無効な状態) の task_scheduler_observer オブジェクトを構築します。 local が false の場合、task_scheduler_observer のグローバル・セマンティクスと同じです。 local が true で、オブザーバーがアクティブな場合、スレッドはタスク領域に追加されると通知を受け取ります。 そして、タスク領域を離れるときも、スレッドは通知を受け取ります。 |
| task_scheduler_observer( task_arena & ) |
指定された task_arena に関連付けられたインアクティブ状態 (監視が無効な状態) の task_scheduler_observer オブジェクトを構築します。 注このようなオブジェクトに対する observe(true) の呼び出しは、指定された task_arena オブジェクトの内部タスク領域の初期化を強制します。 |
| virtual bool on_scheduler_leaving() |
コールバックは、ワーカースレッドがタスク領域を離れる前に、ワーカースレッドで呼び出されます。 false が返された場合、スレッドはタスク領域に残ります。 これは、マスタースレッドに対しては呼び出されません。また、負荷の調整や優先度の変更により、ワーカースレッドがタスク領域を離れる場合にも呼び出されません。 注このメソッドを有効にするには、アプリケーションをコミュニティー・プレビュー・ライブラリーとリンクする必要があります。 |