99 unsigned int fThreadCount{thread::hardware_concurrency ()};
104 optional<Characters::String> fThreadPoolName;
109 optional<QMax> fQMax;
114 bool fCollectStatistics{
false};
130 ThreadPool (
const Options& options);
131 ThreadPool (ThreadPool&&) =
delete;
132 ThreadPool (
const ThreadPool&) =
delete;
135 nonvirtual ThreadPool& operator= (ThreadPool&&) =
delete;
136 nonvirtual ThreadPool& operator= (
const ThreadPool&) =
delete;
165 nonvirtual Options GetOptions ()
const;
171 nonvirtual
unsigned int GetPoolSize ()
const;
183 nonvirtual
void SetPoolSize (
unsigned int poolSize);
209 nonvirtual
TaskType AddTask (
const TaskType& task,
const optional<Characters::String>& name = nullopt);
210 nonvirtual
TaskType AddTask (
const TaskType& task,
QMax qmax,
const optional<Characters::String>& name = nullopt);
213 nonvirtual
TaskType AddTask_ (
const TaskType& task,
const optional<Characters::String>& name);
239 nonvirtual
bool IsPresent (
const TaskType& task)
const;
247 nonvirtual
bool IsRunning (
const TaskType& task)
const;
262 optional<Characters::String> fName;
263 optional<Time::TimePointSeconds> fRunningSince;
265 nonvirtual
bool IsRunning ()
const;
294 nonvirtual
size_t GetTasksCount ()
const;
300 nonvirtual
size_t GetPendingTasksCount ()
const;
339 unsigned int fNumberOfTasksAdded{0};
344 unsigned int fNumberOfTasksCompleted{0};
351 unsigned int fNumberOfTasksReporting{0};
358 optional<Time::DurationSeconds> GetMeanTimeConsumed ()
const;
370 nonvirtual
void ResetStatistics ();
376 nonvirtual Statistics GetCurrentStatistics ()
const;
385 [[deprecated (
"Since Stroika v3.0d5 use Options")]] ThreadPool (
unsigned int tc,
const optional<Characters::String>& name = nullopt)
386 : ThreadPool{Options{tc, name}}
391 bool fCollectStatistics_{
false};
392 Statistics fCollectedTaskStats_;
395 nonvirtual
void Abort_ () noexcept;
398 nonvirtual
void AbortAndWaitForDone_ () noexcept;
406 shared_ptr<MyRunnable_> fRunnable;
412 nonvirtual
void WaitForNextTask_ (TaskType* result, optional<Characters::String>* resultName);
413 nonvirtual TPInfo_ mkThread_ ();
416 struct PendingTaskInfo_ {
418 optional<Characters::String> fName;
420 mutable mutex fCriticalSection_;
422 atomic<bool> fAborted_{
false};
423 optional<QMax> fDefaultQMax_;
424 Containers::Collection<TPInfo_> fThreads_;
425 list<PendingTaskInfo_> fPendingTasks_;
426 WaitableEvent fTasksMaybeAdded_{};
427 atomic<unsigned int> fNextThreadEntryNumber_{1};
428 optional<Characters::String> fThreadPoolName_;
431 friend class MyRunnable_;