Class that represents thread's interest in task scheduling services.
class task_scheduler_observer;
#include "tbb/task_scheduler_observer.h"
A task_scheduler_observer permits clients to observe when a thread starts and stops processing tasks, either globally or in a certain task scheduler arena. You typically derive your own observer class from task_scheduler_observer, and override virtual methods on_scheduler_entry or on_scheduler_exit. Observation can be enabled and disabled for an observer instance; it is disabled on creation. Remember to call observe() to enable observation.
task_scheduler_observer is not suitable for floating-point settings management. Using it for this purpose will cause undefined behavior. See Section Floating-point Settings for more details.
Exceptions thrown and not caught in the overridden methods of task_scheduler_observer result in undefined behavior.
namespace tbb {
class task_scheduler_observer {
public:
explicit task_scheduler_observer( bool local = false );
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 } {}
};
}
The following example sketches the code of an observer that pins TBB worker threads to hardware threads.
class pinning_observer: public tbb::task_scheduler_observer {
public:
affinity_mask_t m_mask; // HW affinity mask to be used for threads in an arena
pinning_observer( tbb::task_arena &a, affinity_mask_t mask )
: tbb::task_scheduler_observer(a), m_mask(mask) {
observe(true); // activate the observer
}
/*override*/ void on_scheduler_entry( bool worker ) {
set_thread_affinity(tbb::this_task_arena::current_thread_index(), m_mask);
}
/*override*/ void on_scheduler_exit( bool worker ) { }
};