23 #include <type_traits>
26 namespace ThreadController_NS {
28 template <
typename FutureReturnType>
37 template <
typename FutureReturnType =
void>
41 template <bool future_return_void = std::is_void<FutureReturnType>::value>
44 template <bool future_return_void = std::is_void<FutureReturnType>::value>
47 std::enable_if_t<!future_return_void>* = 0)
54 std::this_thread::yield();
58 using namespace std::chrono_literals;
59 if (th.wait_for(0ns) == std::future_status::ready) {
69 template <
typename FuncType,
typename... Args>
71 threads_.emplace_back(std::async(std::launch::async, func,
args...));
81 template <bool future_return_void = std::is_void<FutureReturnType>::value>
83 std::enable_if_t<future_return_void>* = 0) {
86 template <bool future_return_void = std::is_void<FutureReturnType>::value>
88 std::enable_if_t<!future_return_void>* = 0) {
95 std::vector<std::future<FutureReturnType>>
threads_;
98 template <
typename FutureReturnType =
void>
102 template <bool future_return_void = std::is_void<FutureReturnType>::value>
104 std::enable_if_t<future_return_void>* = 0)
106 template <bool future_return_void = std::is_void<FutureReturnType>::value>
109 std::enable_if_t<!future_return_void>* = 0)
111 , n_running_threads_(0) {}
118 template <
typename FuncType,
typename... Args>
121 return ++n_running_threads_;
std::vector< std::future< FutureReturnType > > threads_
const FutureGetter< FutureReturnType > future_getter_
SimpleThreadController(const int max_threads, const FutureGetter< FutureReturnType > future_getter, std::enable_if_t<!future_return_void > *=0)
void startThread(FuncType &&func, Args &&...args)
virtual int getThreadCount() const
virtual void checkThreadsStatus()
~SimpleRunningThreadController() override
virtual int getRunningThreadCount() const
virtual ~SimpleThreadController()
SimpleRunningThreadController(const int max_threads, const FutureGetter< FutureReturnType > future_getter, std::enable_if_t<!future_return_void > *=0)
SimpleRunningThreadController(const int max_threads, std::enable_if_t< future_return_void > *=0)
void(*)(FutureReturnType) FutureGetterFunction
int getRunningThreadCount() const override
void get_future(std::future< FutureReturnType > &future, std::enable_if_t<!future_return_void > *=0)
void checkThreadsStatus() override
std::atomic< int > n_running_threads_
int startThread(FuncType &&func, Args &&...args)
void get_future(std::future< FutureReturnType > &future, std::enable_if_t< future_return_void > *=0)
int notify_thread_is_completed()
SimpleThreadController()=delete
SimpleThreadController(const int max_threads, std::enable_if_t< future_return_void > *=0)