Logo ROOT   6.10/09
Reference Guide
TPoolManager.hxx
Go to the documentation of this file.
1 // @(#)root/thread:$Id$
2 // Author: Xavier Valls January 2017
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 //////////////////////////////////////////////////////////////////////////
13 // //
14 // TPoolManager //
15 // //
16 // //
17 // //
18 // //
19 //////////////////////////////////////////////////////////////////////////
20 
21 
22 #ifndef ROOT_TPoolManager
23 #define ROOT_TPoolManager
24 
25 #include "RConfigure.h"
26 #include "Rtypes.h"
27 
28 // exclude in case ROOT does not have IMT support
29 #ifndef R__USE_IMT
30 // No need to error out for dictionaries.
31 # if !defined(__ROOTCLING__) && !defined(G__DICTIONARY)
32 # error "Cannot use ROOT::TPoolManager without defining R__USE_IMT."
33 # endif
34 #else
35 
36 #include<memory>
37 
38 namespace tbb {
39  class task_scheduler_init;
40 }
41 
42 namespace ROOT {
43  namespace Internal {
44  /**
45  \class ROOT::TPoolManager
46  \ingroup TPoolManager
47  \brief A manager for the scheduler behind ROOT multithreading operations.
48 
49  A manager for the multithreading scheduler that solves undefined behaviours and interferences between
50  classes and functions that made direct use of the scheduler, such as EnableImplicitMT() ot TThreadExecutor.
51  */
52 
53  class TPoolManager {
54  public:
55  friend std::shared_ptr<TPoolManager> GetPoolManager(UInt_t nThreads);
56  /// Returns the number of threads running when the scheduler has been instantiated within ROOT.
57  static UInt_t GetPoolSize();
58  /// Terminates the scheduler instantiated within ROOT.
59  ~TPoolManager();
60  private:
61  ///Initializes the scheduler within ROOT. If the scheduler has already been initialized by the
62  /// user before invoking the constructor it won't change its behaviour and it won't terminate it,
63  /// but it will still keep record of the number of threads passed as a parameter.
64  TPoolManager(UInt_t nThreads = 0);
66  bool mustDelete = true;
67  tbb::task_scheduler_init *fSched = nullptr;
68  };
69  /// Get a shared pointer to the manager. Initialize the manager with nThreads if not active. If active,
70  /// the number of threads, even if specified otherwise, will remain the same.
71  ///
72  /// The number of threads will be able to change calling the factory function again after the last
73  /// remaining shared_ptr owning the object is destroyed or reasigned, which will trigger the destructor of the manager.
74  std::shared_ptr<TPoolManager> GetPoolManager(UInt_t nThreads = 0);
75  }
76 }
77 
78 #endif // R__USE_IMT
79 
80 #endif
std::shared_ptr< TPoolManager > GetPoolManager(UInt_t nThreads=0)
Get a shared pointer to the manager.
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
unsigned int UInt_t
Definition: RtypesCore.h:42