70 static unsigned ncores() {
return std::thread::hardware_concurrency(); }
90 template <
typename... Args>
99 template <
typename RetT,
typename FuncT,
typename... Args>
104 auto _ptask = std::make_shared<task_type>(std::forward<FuncT>(func),
105 std::forward<Args>(
args)...);
110 template <
typename RetT,
typename FuncT>
111 std::shared_ptr<PackagedTask<RetT>>
async(FuncT&& func)
115 auto _ptask = std::make_shared<task_type>(std::forward<FuncT>(func));
120 template <
typename FuncT,
typename... Args>
127 auto _ptask = std::make_shared<task_type>(std::forward<FuncT>(func),
128 std::forward<Args>(
args)...);
138 template <
typename RetT,
typename ArgT,
typename FuncT,
typename... Args>
140 FuncT&& func, Args&&...
args)
142 return tg.
wrap(std::forward<FuncT>(func), std::forward<Args>(
args)...);
145 template <
typename RetT,
typename ArgT,
typename FuncT>
148 return tg.
wrap(std::forward<FuncT>(func));
155 template <
typename RetT,
typename ArgT,
typename FuncT,
typename... Args>
158 tg.
exec(std::forward<FuncT>(func), std::forward<Args>(
args)...);
161 template <
typename RetT,
typename ArgT,
typename FuncT>
164 tg.
exec(std::forward<FuncT>(func));
167 template <
typename RetT,
typename ArgT,
typename FuncT,
typename... Args>
170 tg.
exec(std::forward<FuncT>(func), std::forward<Args>(
args)...);
173 template <
typename RetT,
typename ArgT,
typename FuncT>
176 tg.
exec(std::forward<FuncT>(func));
181 template <
typename FuncT,
typename... Args>
184 tg.
exec(std::forward<FuncT>(func), std::forward<Args>(
args)...);
187 template <
typename FuncT>
190 tg.
exec(std::forward<FuncT>(func));
212 static thread_local TaskManager* _instance =
nullptr;
223 auto nthreads = std::thread::hardware_concurrency();
224 std::cout <<
"Allocating mad::TaskManager with " << nthreads <<
" thread(s)..."
253 if(fgInstance() ==
this)
254 fgInstance() =
nullptr;
The task class is supplied to thread_pool.
std::shared_ptr< task_type< Args... > > wrap(Func func, Args... args)
enable_if_t< std::is_void< Up >::value, void > exec(Func func, Args... args)
ThreadPool::size_type size_type
ThreadPool * thread_pool() const
std::shared_ptr< PackagedTask< RetT > > async(FuncT &&func)
TaskManager(this_type &&)=default
void rexec(TaskGroup< void, void > &tg, FuncT &&func, Args &&... args)
void rexec(TaskGroup< void, void > &tg, FuncT &&func)
void exec(Task< Args... > *_task)
TaskManager(ThreadPool *)
static TaskManager *& fgInstance()
this_type & operator=(const this_type &)=delete
void rexec(TaskGroup< RetT, ArgT > &tg, FuncT &&func)
static TaskManager * GetInstanceIfExists()
static TaskManager * GetInstance()
get the singleton pointer
this_type & operator=(this_type &&)=default
std::shared_ptr< Task< RetT, ArgT > > wrap(TaskGroup< RetT, ArgT > &tg, FuncT &&func)
void rexec(TaskGroup< RetT, ArgT > &tg, FuncT &&func, Args &&... args)
std::shared_ptr< Task< RetT, ArgT, Args... > > wrap(TaskGroup< RetT, ArgT > &tg, FuncT &&func, Args &&... args)
void exec(TaskGroup< RetT, ArgT > &tg, FuncT &&func, Args &&... args)
void exec(TaskGroup< RetT, ArgT > &tg, FuncT &&func)
TaskManager(const this_type &)=delete
auto async(FuncT &&func, Args... args) -> std::shared_ptr< PackagedTask< decay_t< decltype(func(args...))>, Args... > >
std::shared_ptr< PackagedTask< RetT, Args... > > async(FuncT &&func, Args &&... args)
static TaskRunManager * GetMasterRunManager(bool useTBB=false)
The task class is supplied to thread_pool.
size_type add_task(task_pointer &&task, int bin=-1)
size_type destroy_threadpool()
std::shared_ptr< T > shared_ptr
typename std::decay< T >::type decay_t