55 class singleton_instance_base {
57 virtual ~singleton_instance_base() {};
58 virtual int level()
const = 0;
61 class singletons_manager {
64 static singletons_manager& manager();
67 static void register_new_singleton(singleton_instance_base *p);
68 static void register_new_singleton(singleton_instance_base *p,
70 static void on_partitions_change();
73 ~singletons_manager();
79 template <
typename T,
int LEV>
80 class singleton_instance :
public singleton_instance_base {
89 static T*& instance_pointer() {
90 return pointer()->thrd_cast();
93 static T*& instance_pointer(
size_t ithread) {
94 return (*pointer())(ithread);
100 inline static T& instance(
size_t ithread) {
101 pointer()->on_thread_update();
102 T*& tinstance_ = instance_pointer(ithread);
104 tinstance_ =
new T();
105 singletons_manager::register_new_singleton(
106 new singleton_instance<T,LEV>(), ithread);
108 return *instance_pointer(ithread);
112 inline static T& instance() {
113 return instance(this_thread());
117 return pointer()->num_threads();
121 return pointer()->this_thread();
124 int level()
const override {
128 ~singleton_instance() {
129 if (!pointer())
return;
130 for(
size_t i = 0; i != pointer()->num_threads(); ++i) {
131 auto &p_singleton = (*pointer())(i);
134 p_singleton =
nullptr;
139 if (initializing_pointer) initializing_pointer =
nullptr;
144 singleton_instance<T, LEV>::initializing_pointer = singleton_instance<T, LEV>::pointer();
165 return singleton_instance<T,LEV>::instance();
168 inline static const T& const_instance() {
172 inline static T&
instance(
size_t ithread) {
173 return singleton_instance<T,LEV>::instance(ithread);
176 inline static const T& const_instance(
size_t ithread){
182 return singleton_instance<T,LEV>::num_threads();
187 return singleton_instance<T, LEV>::this_thread();
static size_type this_thread()
this thread number according to the threading policy of the singleton
static T & instance()
Instance from the current thread.
static size_type num_threads()
number of threads this singleton is distributed on.
Use this template class for any object you want to distribute to open_MP threads.
Tools for multithreaded, OpenMP and Boost based parallelization.
size_t size_type
used as the common size type in the library