97 unsigned int fThreadCount{thread::hardware_concurrency ()};
102 optional<Characters::String> fThreadPoolName;
107 optional<QMax> fQMax;
112 bool fCollectStatistics{
false};
128 ThreadPool (
const Options& options);
129 ThreadPool (ThreadPool&&) =
delete;
130 ThreadPool (
const ThreadPool&) =
delete;
133 nonvirtual ThreadPool& operator= (ThreadPool&&) =
delete;
134 nonvirtual ThreadPool& operator= (
const ThreadPool&) =
delete;
163 nonvirtual Options GetOptions ()
const;
169 nonvirtual
unsigned int GetPoolSize ()
const;
181 nonvirtual
void SetPoolSize (
unsigned int poolSize);
207 nonvirtual
TaskType AddTask (
const TaskType& task,
const optional<Characters::String>& name = nullopt);
208 nonvirtual
TaskType AddTask (
const TaskType& task,
QMax qmax,
const optional<Characters::String>& name = nullopt);
211 nonvirtual
TaskType AddTask_ (
const TaskType& task,
const optional<Characters::String>& name);
237 nonvirtual
bool IsPresent (
const TaskType& task)
const;
245 nonvirtual
bool IsRunning (
const TaskType& task)
const;
260 optional<Characters::String> fName;
261 optional<Time::TimePointSeconds> fRunningSince;
263 nonvirtual
bool IsRunning ()
const;
292 nonvirtual
size_t GetTasksCount ()
const;
298 nonvirtual
size_t GetPendingTasksCount ()
const;
337 unsigned int fNumberOfTasksAdded{0};
342 unsigned int fNumberOfTasksCompleted{0};
349 unsigned int fNumberOfTasksReporting{0};
356 optional<Time::DurationSeconds> GetMeanTimeConsumed ()
const;
368 nonvirtual
void ResetStatistics ();
374 nonvirtual Statistics GetCurrentStatistics ()
const;
383 [[deprecated (
"Since Stroika v3.0d5 use Options")]] ThreadPool (
unsigned int tc,
const optional<Characters::String>& name = nullopt)
384 : ThreadPool{Options{tc, name}}
389 bool fCollectStatistics_{
false};
390 Statistics fCollectedTaskStats_;
393 nonvirtual
void Abort_ () noexcept;
396 nonvirtual
void AbortAndWaitForDone_ () noexcept;
404 shared_ptr<MyRunnable_> fRunnable;
410 nonvirtual
void WaitForNextTask_ (TaskType* result, optional<Characters::String>* resultName);
411 nonvirtual TPInfo_ mkThread_ ();
414 struct PendingTaskInfo_ {
416 optional<Characters::String> fName;
418 mutable mutex fCriticalSection_;
420 atomic<bool> fAborted_{
false};
421 optional<QMax> fDefaultQMax_;
422 Containers::Collection<TPInfo_> fThreads_;
423 list<PendingTaskInfo_> fPendingTasks_;
424 WaitableEvent fTasksMaybeAdded_{};
425 atomic<unsigned int> fNextThreadEntryNumber_{1};
426 optional<Characters::String> fThreadPoolName_;
429 friend class MyRunnable_;