9#include "MantidKernel/DllConfig.h"
37 ThreadScheduler() : m_cost(0), m_costExecuted(0), m_abortException(
""), m_aborted(false) {}
46 virtual void push(std::shared_ptr<Task> newTask) = 0;
53 virtual std::shared_ptr<Task>
pop(
size_t threadnum) = 0;
72 virtual void abort(std::runtime_error exception) {
74 m_abortException = exception;
131 std::atomic<size_t> m_numBusyThreads{0};
153 std::lock_guard<std::mutex> _lock(m_queueLock);
154 return m_queue.empty();
158 void push(std::shared_ptr<Task> newTask)
override {
161 m_cost += newTask->cost();
162 m_queue.emplace_back(newTask);
163 m_queueLock.unlock();
167 std::shared_ptr<Task>
pop(
size_t threadnum)
override {
169 std::shared_ptr<Task> temp =
nullptr;
173 if (!m_queue.empty()) {
175 temp = m_queue.front();
178 m_queueLock.unlock();
185 size_t temp = m_queue.size();
186 m_queueLock.unlock();
197 m_queueLock.unlock();
217 std::shared_ptr<Task>
pop(
size_t threadnum)
override {
219 std::shared_ptr<Task> temp =
nullptr;
223 if (!m_queue.empty()) {
225 temp = m_queue.back();
228 m_queueLock.unlock();
255 std::lock_guard<std::mutex> _lock(m_queueLock);
256 return m_map.empty();
260 void push(std::shared_ptr<Task> newTask)
override {
263 m_cost += newTask->cost();
264 m_map.emplace(newTask->cost(), newTask);
265 m_queueLock.unlock();
269 std::shared_ptr<Task>
pop(
size_t threadnum)
override {
271 std::shared_ptr<Task> temp =
nullptr;
275 if (!m_map.empty()) {
277 auto it = m_map.end();
282 m_queueLock.unlock();
289 size_t temp = m_map.size();
290 m_queueLock.unlock();
301 m_queueLock.unlock();
306 std::multimap<double, std::shared_ptr<Task>>
m_map;
#define UNUSED_ARG(x)
Function arguments are sometimes unused in certain implmentations but are required for documentation ...
A Task is a unit of work to be scheduled and run by a ThreadPool.
A First-In-First-Out Thread Scheduler.
size_t size() override
Returns the size of the queue.
~ThreadSchedulerFIFO() override
Destructor.
void push(std::shared_ptr< Task > newTask) override
Add a Task to the queue.
void clear() override final
Empty out the queue.
std::shared_ptr< Task > pop(size_t threadnum) override
Retrieves the next Task to execute.
std::deque< std::shared_ptr< Task > > m_queue
Queue of tasks.
A Last-In-First-Out Thread Scheduler.
std::shared_ptr< Task > pop(size_t threadnum) override
Retrieves the next Task to execute.
A Largest Cost Thread Scheduler.
~ThreadSchedulerLargestCost() override
Destructor.
std::shared_ptr< Task > pop(size_t threadnum) override
Retrieves the next Task to execute.
void clear() override final
Empty out the queue.
size_t size() override
Returns the size of the queue.
ThreadSchedulerLargestCost()
std::multimap< double, std::shared_ptr< Task > > m_map
A multimap keeps tasks sorted by the key (cost)
void push(std::shared_ptr< Task > newTask) override
Add a Task to the queue.
The ThreadScheduler object defines how tasks are allocated to threads and in what order.
virtual void abort(std::runtime_error exception)
Signal to the scheduler that a task is complete.
bool getAborted()
Returns true if the execution was aborted.
bool m_aborted
The run was aborted due to an exception.
std::runtime_error m_abortException
The exception that aborted the run.
void markIdle()
Mark a thread as no longer busy. See markBusy().
virtual ~ThreadScheduler()=default
Destructor.
double m_costExecuted
Accumulated cost of tasks that have been executed (popped)
double totalCostExecuted()
Returns the total cost of all Task's in the queue.
std::mutex m_queueLock
Mutex to prevent simultaneous access to the queue.
virtual size_t size()=0
Returns the size of the queue.
virtual void finished(Task *task, size_t threadnum)
Signal to the scheduler that a task is complete.
void markBusy()
Mark a thread as busy.
virtual std::shared_ptr< Task > pop(size_t threadnum)=0
Retrieves the next Task to execute.
double totalCost()
Returns the total cost of all Task's in the queue.
std::runtime_error getAbortException()
Returns the exception that was caught, if any.
virtual void push(std::shared_ptr< Task > newTask)=0
Add a Task to the queue.
double m_cost
Total cost of all tasks.
bool hasBusyThreads() const
Returns true if any thread is busy.
ThreadScheduler()
Constructor.
virtual void clear()=0
Empty out the queue.
virtual bool empty()=0
Returns true if the queue is empty.
Helper class which provides the Collimation Length for SANS instruments.