task_scheduler_observer クラスの拡張

概要

ローカル・セマンティクスをサポートし、ワーカースレッドがタスク・スケジューラー領域に加わったときと離脱したときを監視するように、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 オブジェクトを構築します。 localfalse の場合、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 が返された場合、スレッドはタスク領域に残ります。 これは、マスタースレッドに対しては呼び出されません。また、負荷の調整や優先度の変更により、ワーカースレッドがタスク領域を離れる場合にも呼び出されません。

このメソッドを有効にするには、アプリケーションをコミュニティー・プレビュー・ライブラリーとリンクする必要があります。

関連情報