100 unsigned int fThreadCount{thread::hardware_concurrency ()};
105 optional<Characters::String> fThreadPoolName;
110 optional<QMax> fQMax;
115 bool fCollectStatistics{
false};
131 ThreadPool (
const Options& options);
132 ThreadPool (ThreadPool&&) =
delete;
133 ThreadPool (
const ThreadPool&) =
delete;
136 nonvirtual ThreadPool& operator= (ThreadPool&&) =
delete;
137 nonvirtual ThreadPool& operator= (
const ThreadPool&) =
delete;
175 nonvirtual Options GetOptions ()
const;
181 nonvirtual
unsigned int GetPoolSize ()
const;
193 nonvirtual
void SetPoolSize (
unsigned int poolSize);
213 nonvirtual
TaskID AddTask (
const TaskType& task,
const optional<Characters::String>& name = nullopt);
214 nonvirtual
TaskID AddTask (
const TaskType& task,
QMax qmax,
const optional<Characters::String>& name = nullopt);
217 nonvirtual
TaskID AddTask_ (
const TaskType& task,
const optional<Characters::String>& name);
241 nonvirtual
bool IsPresent (
TaskID task)
const;
247 nonvirtual
bool IsRunning (
TaskID task)
const;
261 optional<Characters::String> fName;
262 optional<Time::TimePointSeconds> fRunningSince;
264 nonvirtual
bool IsRunning ()
const;
293 nonvirtual
size_t GetTasksCount ()
const;
299 nonvirtual
size_t GetPendingTasksCount ()
const;
338 unsigned int fNumberOfTasksAdded{0};
343 unsigned int fNumberOfTasksCompleted{0};
350 unsigned int fNumberOfTasksReporting{0};
357 optional<Time::DurationSeconds> GetMeanTimeConsumed ()
const;
369 nonvirtual
void ResetStatistics ();
375 nonvirtual Statistics GetCurrentStatistics ()
const;
384 [[deprecated (
"Since Stroika v3.0d5 use Options")]] ThreadPool (
unsigned int tc,
const optional<Characters::String>& name = nullopt)
385 : ThreadPool{Options{tc, name}}
390 bool fCollectStatistics_{
false};
391 Statistics fCollectedTaskStats_;
394 nonvirtual
void Abort_ () noexcept;
397 nonvirtual
void AbortAndWaitForDone_ () noexcept;
405 shared_ptr<MyRunnable_> fRunnable;
409 struct PendingTaskInfo_ {
412 optional<Characters::String> fName;
418 nonvirtual
void WaitForNextTask_ (PendingTaskInfo_* result);
419 nonvirtual TPInfo_ mkThread_ ();
422 mutable mutex fCriticalSection_;
424 atomic<bool> fAborted_{
false};
425 optional<QMax> fDefaultQMax_;
426 Containers::Collection<TPInfo_> fThreads_;
427 list<PendingTaskInfo_> fPendingTasks_;
428 WaitableEvent fTasksMaybeAdded_{};
429 atomic<unsigned int> fNextThreadEntryNumber_{1};
430 optional<Characters::String> fThreadPoolName_;
433 friend class MyRunnable_;