35#ifndef _BLAZE_UTIL_THREADPOOL_THREADPOOL_H_
36#define _BLAZE_UTIL_THREADPOOL_THREADPOOL_H_
320 using Threads = std::vector< std::unique_ptr<ManagedThread> >;
347 inline size_t size()
const;
348 inline size_t active()
const;
349 inline size_t ready()
const;
356 template<
typename Callable,
typename... Args >
357 void schedule( Callable func, Args&&... args );
364 void resize(
size_t n,
bool block=
false );
397 friend class Thread<TT,MT,LT,CT>;
468 waitForTask_.notify_all();
471 while( total_ != 0UL ) {
472 waitForThread_.wait( lock );
476 for(
auto const& thread : threads_ ) {
506 return taskqueue_.isEmpty();
557 return expected_ - active_;
585template<
typename Callable
590 taskqueue_.push( std::bind<void>( func, std::forward<Args>( args )... ) );
591 waitForTask_.notify_one();
651#if !(defined _MSC_VER)
662 if( n > expected_ ) {
663 for(
size_t i=expected_; i<n; ++i )
670 waitForTask_.notify_all();
672 while( block && total_ != expected_ ) {
673 waitForThread_.wait( lock );
678 for(
typename Threads::iterator thread=threads_.begin(); thread!=threads_.end(); ) {
679 if( (*thread)->hasTerminated() ) {
681 thread = threads_.erase( thread );
705 while( !taskqueue_.isEmpty() || active_ > 0UL ) {
706 waitForThread_.wait( lock );
751 threads_.push_back( std::unique_ptr<ManagedThread>(
new ManagedThread(
this ) ) );
780 while( taskqueue_.isEmpty() )
783 waitForThread_.notify_all();
785 if( total_ > expected_ ) {
790 waitForTask_.wait( lock );
795 task = taskqueue_.pop();
Header file for run time assertion macros.
Base class for non-copyable class instances.
Task queue for the thread pool.
Header file for the Task base class.
Header file for the Thread class.
Base class for non-copyable class instances.
Definition: NonCopyable.h:64
Implementation of a thread pool.
Definition: ThreadPool.h:313
size_t ready() const
Returns the number of currently ready/inactive threads.
Definition: ThreadPool.h:554
void clear()
Removing all scheduled tasks from the thread pool.
Definition: ThreadPool.h:724
Threads threads_
The threads contained in the thread pool.
Definition: ThreadPool.h:387
volatile size_t expected_
Expected number of threads in the thread pool.
Definition: ThreadPool.h:383
Condition waitForThread_
Wait condition for the thread management.
Definition: ThreadPool.h:391
MT Mutex
Type of the mutex.
Definition: ThreadPool.h:323
void schedule(Callable func, Args &&... args)
Scheduling the given function/functor for execution.
Definition: ThreadPool.h:587
void resize(size_t n, bool block=false)
Changes the total number of threads in the thread pool.
Definition: ThreadPool.h:648
void createThread()
Adding a new thread to the thread pool.
Definition: ThreadPool.h:749
CT Condition
Condition variable type.
Definition: ThreadPool.h:325
Mutex mutex_
Synchronization mutex.
Definition: ThreadPool.h:389
ThreadPool(size_t n)
Constructor for the ThreadPool class.
Definition: ThreadPool.h:424
size_t active() const
Returns the number of currently active/busy threads.
Definition: ThreadPool.h:537
std::vector< std::unique_ptr< ManagedThread > > Threads
Type of the thread container.
Definition: ThreadPool.h:320
volatile size_t total_
Total number of threads in the thread pool.
Definition: ThreadPool.h:382
~ThreadPool()
Destructor for the ThreadPool class.
Definition: ThreadPool.h:457
LT Lock
Type of a locking object.
Definition: ThreadPool.h:324
TaskQueue taskqueue_
Task queue for the scheduled tasks.
Definition: ThreadPool.h:388
bool executeTask()
Executing a scheduled task.
Definition: ThreadPool.h:772
bool isEmpty() const
Returns whether any tasks are scheduled for execution.
Definition: ThreadPool.h:503
void wait()
Waiting for all scheduled tasks to be completed.
Definition: ThreadPool.h:701
Condition waitForTask_
Wait condition for idle threads.
Definition: ThreadPool.h:390
size_t size() const
Returns the current size of the thread pool.
Definition: ThreadPool.h:520
volatile size_t active_
Number of currently active/busy threads.
Definition: ThreadPool.h:386
Implementation of a single thread of execution.
Definition: Thread.h:252
Task queue for the thread pool.
Definition: TaskQueue.h:65
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
std::function< void(void)> Task
Handle for a single, executable task.
Definition: Task.h:60
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
Header file for exception macros.
Header file for basic type definitions.