GENEIAL  0.2=/
 All Classes Pages
ThreadedExecutionManager.h
1 #pragma once
2 
3 #include <geneial/utility/ExecutionManager.h>
4 
5 #include <iostream>
6 #include <deque>
7 #include <memory>
8 #include <functional>
9 #include <chrono>
10 #include <thread>
11 #include <mutex>
12 #include <condition_variable>
13 #include <future>
14 #include <list>
15 
16 geneial_private_namespace(geneial)
17 {
18 geneial_private_namespace(utility)
19 {
20 
21 geneial_export_namespace
22 {
23 
24 class ThreadedExecutionManager: public BaseExecutionManager
25 {
26 private:
27  std::deque<std::function<void()>> _tasks;
28 
29  int _activeTasks = 0;
30 
31  std::vector<std::shared_ptr<std::thread>> _threads;
32 
33  std::mutex _mutex;
34 
35  std::condition_variable _condEntry;
36 
37  std::condition_variable _condExit;
38 
39  bool _finish;
40 
41  void inline executor();
42 
43  void inline initializeThreads(const unsigned int amountThreads);
44 
45  unsigned int _amountPerThread = 1;
46 
47 public:
48 
49  explicit ThreadedExecutionManager(const unsigned int amountThreads) :
50  _tasks(), _threads(), _mutex(), _condEntry(), _finish(false),_amountPerThread(1)
51  {
52  initializeThreads(amountThreads);
53  }
54 
55  ThreadedExecutionManager() :
56  _tasks(), _threads(), _mutex(), _condEntry(), _finish(false),_amountPerThread(1)
57  {
58  initializeThreads(
59  std::max(static_cast<unsigned int>(1),
60  static_cast<unsigned int>(std::thread::hardware_concurrency() - 1)));
61  }
62 
63  virtual ~ThreadedExecutionManager()
64  {
65  joinAll();
66  }
67 
68  virtual inline void addTask(std::function<void()> const &task) override;
69 
70  virtual inline void waitForTasks() override;
71 
72  void inline joinAll();
73 
74  unsigned int getAmountPerThread() const
75  {
76  return _amountPerThread;
77  }
78 
83  void setAmountPerThread(unsigned int amountPerThread = 1)
84  {
85  _amountPerThread = amountPerThread;
86  }
87 };
88 
89 } /* geneial_export_namespace */
90 } /* private namespace utility */
91 } /* private namespace geneial */
92 
93 #include <geneial/utility/ThreadedExecutionManager.hpp>