Logo ROOT  
Reference Guide
ROOT::TThreadedObject< T > Class Template Reference

template<class T>
class ROOT::TThreadedObject< T >

A wrapper to make object instances thread private, lazily.

Template Parameters
TClass of the object to be made thread private (e.g. TH1F)

A wrapper which makes objects thread private. The methods of the underlying object can be invoked via the arrow operator. The object is created in a specific thread lazily, i.e. upon invocation of one of its methods. The correct object pointer from within a particular thread can be accessed with the overloaded arrow operator or with the Get method. In case an elaborate thread management is in place, e.g. in presence of stream of operations or "processing slots", it is also possible to manually select the correct object pointer explicitly.

Definition at line 151 of file TThreadedObject.hxx.

Public Member Functions

template<class ... ARGS>
 TThreadedObject (ARGS &&... args)
 Construct the TThreadedObject and the "model" of the thread private objects. More...
 
 TThreadedObject (const TThreadedObject &)=delete
 
template<class... ARGS>
 TThreadedObject (TNumSlots initSlots, ARGS &&... args)
 Construct the TThreadedObject with initSlots empty slots and the "model" of the thread private objects. More...
 
std::shared_ptr< T > Get ()
 Access the pointer corresponding to the current slot. More...
 
std::shared_ptr< T > GetAtSlot (unsigned i)
 Access a particular processing slot. More...
 
T * GetAtSlotRaw (unsigned i) const
 Access a particular slot which corresponds to a single thread. More...
 
std::shared_ptr< T > GetAtSlotUnchecked (unsigned i) const
 Access a particular slot which corresponds to a single thread. More...
 
unsigned GetNSlots () const
 Return the number of currently available slot. More...
 
std::shared_ptr< T > Merge (TThreadedObjectUtils::MergeFunctionType< T > mergeFunction=TThreadedObjectUtils::MergeTObjects< T >)
 Merge all the thread private objects. More...
 
T * operator-> ()
 Access the wrapped object and allow to call its methods. More...
 
void SetAtSlot (unsigned i, std::shared_ptr< T > v)
 Set the value of a particular slot. More...
 
std::unique_ptr< T > SnapshotMerge (TThreadedObjectUtils::MergeFunctionType< T > mergeFunction=TThreadedObjectUtils::MergeTObjects< T >)
 Merge all the thread private objects. More...
 

Static Public Attributes

static constexpr const TNumSlots fgMaxSlots {64}
 The initial number of empty processing slots that a TThreadedObject is constructed with by default. More...
 

Private Member Functions

unsigned GetThisSlotNumber ()
 Get the slot number for this threadID, make a slot if needed. More...
 

Private Attributes

std::deque< TDirectory * > fDirectories
 A TDirectory per slot. More...
 
bool fIsMerged: 1
 Remember if the objects have been merged already. More...
 
std::unique_ptr< T > fModel
 Use to store a "model" of the object. More...
 
std::deque< std::shared_ptr< T > > fObjPointers
 An object pointer per slot. More...
 
ROOT::TSpinMutex fSpinMutex
 Protects concurrent access to fThrIDSlotMap, fObjPointers. More...
 
std::map< std::thread::id, unsigned > fThrIDSlotMap
 A mapping between the thread IDs and the slots. More...
 

#include <ROOT/TThreadedObject.hxx>

Constructor & Destructor Documentation

◆ TThreadedObject() [1/3]

template<class T >
ROOT::TThreadedObject< T >::TThreadedObject ( const TThreadedObject< T > &  )
delete

◆ TThreadedObject() [2/3]

template<class T >
template<class... ARGS>
ROOT::TThreadedObject< T >::TThreadedObject ( TNumSlots  initSlots,
ARGS &&...  args 
)
inline

Construct the TThreadedObject with initSlots empty slots and the "model" of the thread private objects.

Parameters
initSlotsSet the initial number of slots of the TThreadedObject.
Template Parameters
ARGSArguments of the constructor of T

This form of the constructor is useful to manually pre-set the content of a given number of slots when used in combination with TThreadedObject::SetAtSlot().

Definition at line 166 of file TThreadedObject.hxx.

◆ TThreadedObject() [3/3]

template<class T >
template<class ... ARGS>
ROOT::TThreadedObject< T >::TThreadedObject ( ARGS &&...  args)
inline

Construct the TThreadedObject and the "model" of the thread private objects.

Template Parameters
ARGSArguments of the constructor of T

Definition at line 183 of file TThreadedObject.hxx.

Member Function Documentation

◆ Get()

template<class T >
std::shared_ptr<T> ROOT::TThreadedObject< T >::Get ( )
inline

Access the pointer corresponding to the current slot.

This method is not adequate for being called inside tight loops as it implies a lookup in a mapping between the threadIDs and the slot indices. A good practice consists in copying the pointer onto the stack and proceed with the loop as shown in this work item (psudo-code) which will be sent to different threads:

auto workItem = [](){
auto objPtr = tthreadedObject.Get();
for (auto i : ROOT::TSeqI(1000)) {
// tthreadedObject->FastMethod(i); // don't do this! Inefficient!
objPtr->FastMethod(i);
}
}

Definition at line 279 of file TThreadedObject.hxx.

◆ GetAtSlot()

template<class T >
std::shared_ptr<T> ROOT::TThreadedObject< T >::GetAtSlot ( unsigned  i)
inline

Access a particular processing slot.

This method is thread-safe as long as concurrent calls request different slots (i.e. pass a different argument) and no thread accesses slot i via the arrow operator, so mixing usage of GetAtSlot with usage of the arrow operator can be dangerous.

Definition at line 201 of file TThreadedObject.hxx.

◆ GetAtSlotRaw()

template<class T >
T* ROOT::TThreadedObject< T >::GetAtSlotRaw ( unsigned  i) const
inline

Access a particular slot which corresponds to a single thread.

This overload is faster than the GetAtSlotUnchecked method but the caller is responsible to make sure that the slot exists, to check that the contained object is initialized and that the returned pointer will not outlive the TThreadedObject that returned it, which maintains ownership of the actual object.

Definition at line 259 of file TThreadedObject.hxx.

◆ GetAtSlotUnchecked()

template<class T >
std::shared_ptr<T> ROOT::TThreadedObject< T >::GetAtSlotUnchecked ( unsigned  i) const
inline

Access a particular slot which corresponds to a single thread.

This is in general faster than the GetAtSlot method but it is responsibility of the caller to make sure that the slot exists and to check that the contained object is initialized (and not a nullptr).

Definition at line 248 of file TThreadedObject.hxx.

◆ GetNSlots()

template<class T >
unsigned ROOT::TThreadedObject< T >::GetNSlots ( ) const
inline

Return the number of currently available slot.

The method is safe to call concurrently to other TThreadedObject methods. Note that slots could be available but contain no data (i.e. a nullptr) if they have not been used yet.

Definition at line 190 of file TThreadedObject.hxx.

◆ GetThisSlotNumber()

template<class T >
unsigned ROOT::TThreadedObject< T >::GetThisSlotNumber ( )
inlineprivate

Get the slot number for this threadID, make a slot if needed.

Definition at line 337 of file TThreadedObject.hxx.

◆ Merge()

template<class T >
std::shared_ptr<T> ROOT::TThreadedObject< T >::Merge ( TThreadedObjectUtils::MergeFunctionType< T >  mergeFunction = TThreadedObjectUtils::MergeTObjects<T>)
inline

Merge all the thread private objects.

Can be called once: it does not create any new object but destroys the present bookkeping collapsing all objects into the one at slot 0.

Definition at line 293 of file TThreadedObject.hxx.

◆ operator->()

template<class T >
T* ROOT::TThreadedObject< T >::operator-> ( )
inline

Access the wrapped object and allow to call its methods.

Definition at line 285 of file TThreadedObject.hxx.

◆ SetAtSlot()

template<class T >
void ROOT::TThreadedObject< T >::SetAtSlot ( unsigned  i,
std::shared_ptr< T >  v 
)
inline

Set the value of a particular slot.

This method is thread-safe as long as concurrent calls access different slots (i.e. pass a different argument) and no thread accesses slot i via the arrow operator, so mixing usage of SetAtSlot with usage of the arrow operator can be dangerous.

Definition at line 226 of file TThreadedObject.hxx.

◆ SnapshotMerge()

template<class T >
std::unique_ptr<T> ROOT::TThreadedObject< T >::SnapshotMerge ( TThreadedObjectUtils::MergeFunctionType< T >  mergeFunction = TThreadedObjectUtils::MergeTObjects<T>)
inline

Merge all the thread private objects.

Can be called many times. It does create a new instance of class T to represent the "Sum" object. This method is not thread safe: correct or acceptable behaviours depend on the nature of T and of the merging function.

Definition at line 311 of file TThreadedObject.hxx.

Member Data Documentation

◆ fDirectories

template<class T >
std::deque<TDirectory*> ROOT::TThreadedObject< T >::fDirectories
private

A TDirectory per slot.

Definition at line 331 of file TThreadedObject.hxx.

◆ fgMaxSlots

template<class T >
constexpr const TNumSlots ROOT::TThreadedObject< T >::fgMaxSlots {64}
staticconstexpr

The initial number of empty processing slots that a TThreadedObject is constructed with by default.

Deprecated: TThreadedObject grows as more slots are required.

Definition at line 155 of file TThreadedObject.hxx.

◆ fIsMerged

template<class T >
bool ROOT::TThreadedObject< T >::fIsMerged
private

Remember if the objects have been merged already.

Definition at line 334 of file TThreadedObject.hxx.

◆ fModel

template<class T >
std::unique_ptr<T> ROOT::TThreadedObject< T >::fModel
private

Use to store a "model" of the object.

Definition at line 326 of file TThreadedObject.hxx.

◆ fObjPointers

template<class T >
std::deque<std::shared_ptr<T> > ROOT::TThreadedObject< T >::fObjPointers
private

An object pointer per slot.

Definition at line 328 of file TThreadedObject.hxx.

◆ fSpinMutex

template<class T >
ROOT::TSpinMutex ROOT::TThreadedObject< T >::fSpinMutex
mutableprivate

Protects concurrent access to fThrIDSlotMap, fObjPointers.

Definition at line 333 of file TThreadedObject.hxx.

◆ fThrIDSlotMap

template<class T >
std::map<std::thread::id, unsigned> ROOT::TThreadedObject< T >::fThrIDSlotMap
private

A mapping between the thread IDs and the slots.

Definition at line 332 of file TThreadedObject.hxx.


The documentation for this class was generated from the following file:
ROOT::TSeq
A pseudo container class which is a generator of indices.
Definition: TSeq.hxx:66