c++-gtk-utils
Public Types | Public Member Functions | List of all members
Cgu::Thread::TaskManager Class Reference

A thread-pool class for managing tasks in multi-threaded programs. More...

#include <c++-gtk-utils/task_manager.h>

Public Types

enum  StopMode { wait_for_running, wait_for_all }
 

Public Member Functions

 TaskManager (const TaskManager &)=delete
 
TaskManageroperator= (const TaskManager &)=delete
 
unsigned int get_max_threads () const
 
unsigned int get_min_threads () const
 
unsigned int get_used_threads () const
 
unsigned int get_tasks () const
 
void set_max_threads (unsigned int max)
 
void change_max_threads (int delta)
 
unsigned int get_idle_time () const
 
void set_idle_time (unsigned int idle)
 
bool get_blocking () const
 
void set_blocking (bool blocking)
 
StopMode get_stop_mode () const
 
void set_stop_mode (StopMode mode)
 
void stop_all ()
 
void add_task (const Callback::Callback *task)
 
void add_task (std::unique_ptr< const Callback::Callback > task, std::unique_ptr< const Callback::Callback > fail)
 
bool is_error () const
 
template<class Ret , class... Params, class... Args, class T >
Cgu::SharedLockPtr
< Cgu::AsyncResult< Ret > > 
make_task_result (T &t, Ret(T::*func)(Params...), Args &&...args)
 
template<class Ret , class... Params, class... Args, class T >
void make_task_when_full (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, Cgu::Releaser *when_releaser, std::unique_ptr< const Cgu::Callback::Callback > fail, Cgu::Releaser *fail_releaser, gint priority, GMainContext *context, T &t, Ret(T::*func)(Params...), Args &&...args)
 
template<class Ret , class... Params, class... Args, class T >
void make_task_when (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, T &t, Ret(T::*func)(Params...), Args &&...args)
 
template<class Ret , class... Params, class... Args, class T >
Cgu::SharedLockPtr
< Cgu::AsyncResult< Ret > > 
make_task_result (const T &t, Ret(T::*func)(Params...) const, Args &&...args)
 
template<class Ret , class... Params, class... Args, class T >
void make_task_when_full (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, Cgu::Releaser *when_releaser, std::unique_ptr< const Cgu::Callback::Callback > fail, Cgu::Releaser *fail_releaser, gint priority, GMainContext *context, const T &t, Ret(T::*func)(Params...) const, Args &&...args)
 
template<class Ret , class... Params, class... Args, class T >
void make_task_when (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, const T &t, Ret(T::*func)(Params...) const, Args &&...args)
 
template<class Ret , class... Params, class... Args>
Cgu::SharedLockPtr
< Cgu::AsyncResult< Ret > > 
make_task_result (Ret(*func)(Params...), Args &&...args)
 
template<class Ret , class... Params, class... Args>
void make_task_when_full (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, Cgu::Releaser *when_releaser, std::unique_ptr< const Cgu::Callback::Callback > fail, Cgu::Releaser *fail_releaser, gint priority, GMainContext *context, Ret(*func)(Params...), Args &&...args)
 
template<class Ret , class... Params, class... Args>
void make_task_when (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, Ret(*func)(Params...), Args &&...args)
 
template<class Ret , class Func >
Cgu::SharedLockPtr
< Cgu::AsyncResult< Ret > > 
make_task_result (Func &&f)
 
template<class Ret , class Func >
void make_task_when_full (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, Cgu::Releaser *when_releaser, std::unique_ptr< const Cgu::Callback::Callback > fail, Cgu::Releaser *fail_releaser, gint priority, GMainContext *context, Func &&f)
 
template<class Ret , class Func >
void make_task_when (std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, Func &&f)
 
template<class Ret , class Func >
void make_task_compose (Func &&f, GMainContext *context, std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when)
 
 TaskManager (unsigned int max=8, unsigned int min=0, unsigned int idle=10000, bool blocking=true, StopMode mode=TaskManager::wait_for_all)
 
 ~TaskManager ()
 

Detailed Description

A thread-pool class for managing tasks in multi-threaded programs.

See Also
Cgu::Thread::Future Cgu::AsyncResult Cgu::AsyncQueueDispatch Cgu::Callback::post()

Cgu::Thread::Future operates on the principle of there being one worker thread per task. In some cases however, it may be better to have a limited pool of worker threads executing a larger number of tasks. This class implements this approach via a thread pool.

One common approach for thread pools of this kind is to set the maximum number of threads to the number of cores, or some number less than the number of cores, available on the local machine. How that can be determined is system specific (on linux it can be obtained by, for example, inspecting the 'siblings' and 'cpu cores' fields in /proc/cpuinfo or by using sysconf with the glibc extension for _SC_NPROCESSORS_ONLN).

Where the task needs to provide a result, two approaches can be adopted. First, the task callback can have a Cgu::AsyncResult object held by Cgu::SharedLockPtr (or by std::shared_ptr having a thread safe reference count) bound to it. Alternatively, a task can provide a result asynchronously to a glib main loop by calling Cgu::Callback::post() when it is ready to do so. From version 2.0.13, the TaskManager::make_task_result(), TaskManager::make_task_when(), TaskManager::make_task_when_full() and TaskManager::make_task_compose() convenience wrapper methods are provided which will set this up for you (including constructing appropriate task callbacks) for target functions which return a value. Tasks can add other tasks, enabling the composition of an arbitrary number of tasks to obtain a final result.

TaskManager objects do not provide thread cancellation. Thread cancellation is incompatible with the task-centred thread pool model. If task cancellation is wanted, use a Cgu::Thread::Future (or Cgu::Thread::Thread or Cgu::Thread::JoinableHandle) object instead, and have a dedicated thread for the cancelable task.

If glib < 2.32 is installed, g_thread_init() must be called before any TaskManager objects are constructed, which in turn means that with glib < 2.32 TaskManager objects may not be constructed as static objects in global namespace (that is, before g_thread_init() has been called in the program).

Any exceptions which propagate from a task will be consumed to protect the TaskManager object, and to detect whether this has happened there is a version of the TaskManager::add_task() method which takes a second argument comprising a 'fail' callback. If an exception propagates from the 'fail' callback that is also consumed and a g_critical() message issued.

Tasks can be aborted by throwing Cgu::Thread::Exit (as well as any other exception). Where a thread is managed by a TaskManager object, throwing Cgu::Thread::Exit will only terminate the task and not the thread on which it is running (and will cause the 'fail' callback to be executed, if there is one).

TaskManager objects have no copy constructor or copy assignment operator, as copying them would have no obvious semantic meaning. Whilst swapping or moving TaskManager objects would be meaningful, this is not implemented either because it would require an additional internal lock to be thread safe, and the circumstances in which moving or swapping would be useful are limited. Where a move option is wanted, a TaskManager object can be constructed on free store and held by std::unique_ptr.

Here is a compilable example of the calculator class referred to in the documentation on the AsyncResult but which uses a TaskManager object so that the calculator class can run more than one thread to service its calculations:

#include <vector>
#include <numeric>
#include <ostream>
#include <iostream>
#include <glib.h>
using namespace Cgu;
class Calcs {
public:
SharedLockPtr<AsyncResult<double>> mean(const std::vector<double>& nums) {
tm.add_task(Callback::lambda<>([=]() {
if (nums.empty()) res->set(0.0);
else res->set(std::accumulate(nums.begin(), nums.end(), 0.0)/nums.size());
}));
return res;
}
// ... other calculation methods here
};
int main () {
g_thread_init(0);
Calcs calcs;
auto res1 = calcs.mean(std::vector<double>({1, 2, 8, 0}));
auto res2 = calcs.mean(std::vector<double>({101, 53.7, 87, 1.2}));
// ... do something else
std::cout << res1->get() << std::endl;
std::cout << res2->get() << std::endl;
}

The TaskManager::make_task_result(), TaskManager::make_task_when_full(), TaskManager::make_task_when() and TaskManager::make_task_compose() functions

From version 2.0.13 the TaskManager::make_task_result(), TaskManager::make_task_when(), TaskManager::make_task_when_full() and TaskManager::make_task_compose() convenience wrapper methods are provided, which construct a task from a target function returning a value by calling TaskManager::add_task() with an appropriate callback object. TaskManager::make_task_result() returns a Cgu::AsyncResult object held by Cgu::SharedLockPtr which will hold the result provided by the function; TaskManager::make_task_when(), TaskManager::make_task_when_full() and TaskManager::make_task_compose() execute a callback in a glib main loop when the task has completed by passing the callback the target function's return value. The wrappers therefore provide a similar interface to the one provided by Cgu::Thread::Future objects. These wrapper methods can make it easier to compose the results of a number of different tasks.

The TaskManager::make_task_result(), TaskManager::make_task_when() and TaskManager::make_task_when_full() can take a plain function, static member function or non-static member function as the target function, and can take up to three arguments in the case of a non-static member function, and four arguments in the case of any other function. The arguments can be taken by the function by value or by reference to const, but not by reference to non-const (that would not be safe, and a compile error will be generated if that is attempted). In the case of a non-static member function, the referenced object whose member function is to be called must remain in existence until the task concerned has completed. Alternatively, a callable object such as a std::function object, a lambda or the return value of std::bind can be passed, which can have any number of arguments using lambda capture or std::bind (and which can also bind the referenced object of a non-static member function by taking a copy of it where that is necessary). TaskManager::make_task_compose() only takes a callable object for its task.

Where a callable object is not passed, internal moving/copying of arguments for the target function to be represented by the task takes place (once by invoking the rvalue move constructor or lvalue copy constructor, as appropriate, when the wrapper methods are called and, if the argument is not a const reference argument, once when the task is dispatched by the TaskManager object). Therefore, if a non-trivial class object is to be received by the target function as an argument, it is best either (a) if it has a move constructor, to pass it to the TaskManager::make_task_result(), TaskManager::make_task_when() or TaskManager::make_task_when_full() wrapper method as a temporary and have the target function take a const reference argument, or (b) for it to be constructed on free store and for the target function to receive it by pointer, by Cgu::SharedLockPtr, or by a std::shared_ptr implementation which has a thread-safe reference count. Note also that constructing callable objects using std::bind will cause copies of arguments to be made, as will lambda capture, so when not using TaskManager::make_task_compose() ordinarily it is better to pass a function pointer with arguments to the wrapper methods rather than a function object.

Copying of the return value of the target function represented by the task may also take place. When a task completes, the return value will be stored, either in a Cgu::AsyncResult object (if TaskManager::make_task_result() is called) or for the purposes of executing the 'when' callback in a glib main loop (if TaskManager::make_task_when(), TaskManager::make_task_when_full() or TaskManager::make_task_compose() are called). This storage will therefore cause the return value type's assignment operator or copy constructor to be called once unless that type has a move assignment operator or move constructor, in which case a move operation will be made. Note that a 'when' callback takes the stored return value by reference to const and so without any additional copying upon the 'when' callback being executed in the main loop.

With version 2.0.13 of the library, if a callable object which was not a std::function object (such as a lambda) was passed, the return value had to be explicitly stated in the call to make_task_*(). So, if a lambda expression returning an int was to be executed as a task, TaskManager::make_task_result<int>(), TaskManager::make_task_when_full<int>(), TaskManager::make_task_when<int>() or TaskManager::make_task_compose<int>() had to be called. This is no longer necessary with version 2.0.14: the return value will be deduced automatically if it is not stated.

Here is a compilable example of the calculator class using TaskManager::make_task_result():

#include <vector>
#include <numeric>
#include <ostream>
#include <iostream>
#include <glib.h>
using namespace Cgu;
class Calcs {
public:
SharedLockPtr<AsyncResult<double>> mean(const std::vector<double>& nums) {
return tm.make_task_result([=]() {
if (nums.empty()) return 0.0;
return std::accumulate(nums.begin(), nums.end(), 0.0)/nums.size();
});
}
// ... other calculation methods here
};
int main () {
g_thread_init(0);
Calcs calcs;
auto res1 = calcs.mean(std::vector<double>({1, 2, 8, 0}));
auto res2 = calcs.mean(std::vector<double>({101, 53.7, 87, 1.2}));
// ... do something else
std::cout << res1->get() << std::endl;
std::cout << res2->get() << std::endl;
}

Here is a reimplementation, using TaskManager::make_task_when(), of the Number class example with get_primes() method given in the documentation for Cgu::Thread::Future:

class Numbers {
public:
std::vector<long> get_primes(int n); // calculates the first n primes
// and puts them in a vector
...
};
void print_primes(const std::vector<long>& result) {
std::for_each(result.begin(), result.end(), [](long l) {std::cout << l << std::endl;});
}
Numbers obj;
// get the first 1,000 primes
using namespace Cgu;
std::unique_ptr<const Callback::CallbackArg<const std::vector<long>&>> when(
Callback::make(&print_primes)
);
tm.make_task_when(std::move(when),
0, // default main loop context
obj,
&Numbers::get_primes,
1000);

Where a member function or ordinary function to be represented by a task is overloaded, this will cause difficulties in template type deduction when TaskManager::make_task_result(), TaskManager::make_task_when() or TaskManager::make_task_when_full() are called. Explicit disambiguation would be required, for example:

class Numbers {
public:
int calc(int i);
int calc(double d);
...
};
Numbers obj;
using namespace Cgu;
int i = 1;
double d = 2.0;
auto res1 =
tm.make_task_result(obj, static_cast<int (Numbers::*)(int)>(&Numbers::calc), i);
auto res2 =
tm.make_task_result(obj, static_cast<int (Numbers::*)(double)>(&Numbers::calc), d);

Member Enumeration Documentation

Enumerator
wait_for_running 
wait_for_all 

Constructor & Destructor Documentation

Cgu::Thread::TaskManager::TaskManager ( const TaskManager )
delete

This class cannot be copied. The copy constructor is deleted.

Cgu::Thread::TaskManager::TaskManager ( unsigned int  max = 8,
unsigned int  min = 0,
unsigned int  idle = 10000,
bool  blocking = true,
StopMode  mode = TaskManager::wait_for_all 
)

If the specified minimum number of threads is greater than 0, this constructor will start the required minimum number of threads. If glib < 2.32 is installed, g_thread_init() must be called before any TaskManager objects are constructed

Parameters
maxThe maximum number of threads which the TaskManager object will run in the thread pool. If the value passed as this argument is less than the value passed as 'min', the maximum number of threads will be set to 'min'. A value of 0 is not valid, and if this is passed the number will be set to the greater of 1 and 'min'.
minThe minimum number of threads which the TaskManager object will run in the thread pool.
idleThe length of time in milliseconds that threads greater in number than 'min' and not executing any tasks will remain in existence. The default is 10000 (10 seconds).
blockingIf true, calls to stop_all() and the destructor will not return until the tasks remaining to be executed have finished (what is meant by "the tasks remaining to be executed" depends on the StopMode setting, for which see the documentation on the stop_all() method). If false, stop_all() and the destructor will return straight away (which in terms of the TaskManager class implementation is safe for the reasons explained in the documentation on the destructor).
modeThe StopMode setting (either Cgu::Thread::TaskManager::wait_for_running or Cgu::Thread::TaskManager::wait_for_all) executed when running stop_all() or when the destructor is called. See the documentation on stop_all() for an explanation of the setting.
Exceptions
std::bad_allocThis exception might be thrown if memory is exhausted and the system throws in that case.
Cgu::Thread::TaskErrorThis exception will be thrown if starting the specified minimum number of threads fails.
Cgu::Thread::MutexErrorThis exception might be thrown if initialisation of the contained mutex fails. (It is often not worth checking for this, as it means either memory is exhausted or pthread has run out of other resources to create new mutexes.)
Cgu::Thread::CondErrorThis exception might be thrown if initialisation of the contained condition variable fails. (It is often not worth checking for this, as it means either memory is exhausted or pthread has run out of other resources to create new condition variables.)

Since 2.0.12

Cgu::Thread::TaskManager::~TaskManager ( )

The destructor will call stop_all(), unless that method has previously been called explicitly without throwing std::bad_alloc. If the blocking setting is true, the destructor will not return until the tasks remaining to be executed have finished (what is meant by "the tasks remaining to be executed" depends on the StopMode setting, for which see the documentation on the stop_all() method.) If the blocking setting is false, the destructor will return straight away: this is safe, because TaskManager's internals for running tasks have been implemented using reference counting and will not be deleted until all threads running on the TaskManager object have finished, although the remaining tasks should not attempt to call any of TaskManager's methods once the TaskManager object itself has been destroyed.

The destructor is thread safe (any thread can destroy a TaskManager object) unless the blocking setting is true, in which case no task running on the TaskManager object may destroy the TaskManager object. Subject to that, it is not an error for a thread to destroy a TaskManager object and so invoke this destructor while another thread is already blocking in (if the blocking setting is true) or already out of (if the blocking setting is false) a call to stop_all() and remaining tasks are executing: if blocking, both calls (to stop_all() and to this destructor) would safely block together. Any given thread can similarly safely follow a non-blocking call to stop_all() by a non-blocking call to this destructor even though remaining tasks are executing. However, it is an error for a thread to call stop_all() after another thread has begun destruction of the TaskManager object (that is, after this destructor has been entered): there would then be an unresolvable race with the destructor.

The destructor will not throw.

If stop_all() has not previously been called explicitly and throws std::bad_alloc() when called in this destructor, the exception will be caught and consumed, but then the destructor will not block even if the blocking setting is true, and if the minimum number of threads is not 0 some threads might remain running during the entire program duration (albeit safely). Where the throwing of std::bad_alloc is a meaningful event (usually it isn't) and needs to be guarded against, call stop_all() explicitly before this destructor is entered, or use a minimum thread value of 0 and allow for the case of the destructor not blocking.

Since 2.0.12

Member Function Documentation

void Cgu::Thread::TaskManager::add_task ( const Callback::Callback task)
inline

This method adds a new task. If one or more threads in the pool are currently blocking and waiting for a task, then the task will begin executing immediately in one of the threads. If not, and the value returned by get_used_threads() is less than the value returned by get_max_threads(), a new thread will start and the task will execute immediately in the new thread. Otherwise, the task will be queued for execution as soon as a thread becomes available. Tasks will be executed in the order in which they are added to the ThreadManager object. This method is thread safe (any thread may call it, including any task running on the TaskManager object).

A task may terminate itself prematurely by throwing Cgu::Thread::Exit. In addition, the implementation of TaskManager will consume any other exception escaping from the task callback and safely terminate the task concerned in order to protect the integrity of the TaskManager object. Where detecting any of these outcomes is important (usually it won't be), the two argument version of this method is available so that a 'fail' callback can be executed in these circumstances.

Parameters
taskA callback representing the new task, as constructed by the Callback::make(), Callback::make_ref() or Callback::lambda() factory functions. Ownership is taken of this callback, and it will be disposed of when it has been finished with. The destructors of any bound arguments in the callback must not throw.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion). If this exception is thrown, the 'task' callback will be disposed of.
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.) If this exception is thrown, the 'task' callback will be disposed of.

Since 2.0.12

void Cgu::Thread::TaskManager::add_task ( std::unique_ptr< const Callback::Callback task,
std::unique_ptr< const Callback::Callback fail 
)

This method adds a new task. If one or more threads in the pool are currently blocking and waiting for a task, then the task will begin executing immediately in one of the threads. If not, and the value returned by get_used_threads() is less than the value returned by get_max_threads(), a new thread will start and the task will execute immediately in the new thread. Otherwise, the task will be queued for execution as soon as a thread becomes available. Tasks will be executed in the order in which they are added to the ThreadManager object. This method is thread safe (any thread may call it, including any task running on the TaskManager object).

A task may terminate itself prematurely by throwing Cgu::Thread::Exit. In addition, the implementation of TaskManager will consume any other exception escaping from the task callback and safely terminate the task concerned in order to protect the integrity of the TaskManager object. Where detecting any of these outcomes is important (usually it won't be), a callback can be passed to the 'fail' argument which will execute if, and only if, either Cgu::Thread::Exit is thrown or some other exception has propagated from the task. This 'fail' callback is different from the 'fail' callback of Cgu::Thread::Future objects (programming for many tasks to a lesser number of threads requires different approaches from programming for one thread per task), and it executes in the task thread rather than executing in a glib main loop (however, the 'fail' callback can of course call Cgu::Callback::post() to execute another callback in a main loop, if that is what is wanted).

Parameters
taskA callback representing the new task, as constructed by the Callback::make(), Callback::make_ref() or Callback::lambda() factory functions.
failA callback which will be executed if the function executed by the 'task' callback exits by throwing Thread::Exit or some other exception. If an exception propagates from the function represented by the 'fail' callback, this will be consumed to protect the TaskManager object, and a g_critical() warning will be issued.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. Question: why does the single argument version of add_task() take a pointer, and this version take the callbacks by std::unique_ptr? Answer: The two argument version of add_task() takes its arguments by std::unique_ptr in order to be exception safe if the first callback to be constructed is constructed correctly but construction of the second callback object throws.
2. If the library is compiled using the --with-auto-ptr configuration option, then this method's signature is add_task(std::auto_ptr<const Callback::Callback>, std::auto_ptr<const Callback::Callback>) in order to retain compatibility with the 1.2 series of the library.

Since 2.0.12

void Cgu::Thread::TaskManager::change_max_threads ( int  delta)

This will increase, or if 'delta' is negative reduce, the maximum number of threads which the TaskManager object will currently run in the thread pool by the value of 'delta'. The purpose of this is to enable a task to increment the maximum thread number where it is about to enter a call which may block for some time, with a view to decrementing it later when it has finished making blocking calls, so as to enable another thread to keep a core active. If 'delta' is negative and results in a max_threads value of less than the current number of running threads, the number of threads actually running will only be reduced as tasks complete, or as idle timeouts expire. This method does nothing if stop_all() has previously been called. This method is thread safe.

Parameters
deltaThe change (positive or negative) to the maximum number of threads which the TaskManager object will currently run in the thread pool. This method will not set the maximum value of threads to a value less than that returned by get_min_threads(), nor to a value less than 1.
Exceptions
std::bad_allocIf this call is passed a positive value and tasks are currently queued for execution, a new thread or threads will be started for the queued tasks, so this exception may be thrown on starting a new thread if memory is exhausted and the system throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorIf this call is passed a positive value and tasks are currently queued for execution, a new thread or threads will be started for the queued tasks, so this exception may be thrown on starting a new thread if it fails to start correctly (this would mean that memory is exhausted, the pthread thread limit has been reached or pthread has run out of other resources to start new threads).

Since 2.0.14

bool Cgu::Thread::TaskManager::get_blocking ( ) const

Gets the current blocking setting, which determines whether calls to stop_all() and the destructor will block waiting for all remaining tasks to complete. This value is established initially by the 'blocking' argument passed to the TaskManager constructor and can subequently be changed by calling set_blocking(). This method will not throw and is thread safe.

Returns
The current blocking setting.

Since 2.0.12

unsigned int Cgu::Thread::TaskManager::get_idle_time ( ) const

Gets the length of time in milliseconds that threads greater in number than the minimum and not executing any tasks will remain in existence waiting for new tasks. This value is established initially by the 'idle' argument passed to the TaskManager constructor and can subequently be changed by calling set_idle_time(). The default value is 10000 (10 seconds). This method will not throw and is thread safe.

Returns
The idle time in milliseconds.

Since 2.0.12

unsigned int Cgu::Thread::TaskManager::get_max_threads ( ) const

Gets the maximum number of threads which the TaskManager object is currently set to run in the thread pool. This value is established initially by the 'max' argument passed to the TaskManager constructor and can subequently be changed by calling set_max_threads() or change_max_threads(). The default value is 8. This method will not throw and is thread safe.

Returns
The maximum number of threads.

Since 2.0.12

unsigned int Cgu::Thread::TaskManager::get_min_threads ( ) const

Gets the minimum number of threads which the TaskManager object will run in the thread pool (these threads will last until stop_all() is called or the TaskManager object is destroyed). This value is established by the 'min' argument passed to the TaskManager constructor and cannot subequently be changed. The default is 0. This method will not throw and is thread safe.

Returns
The minimum number of threads.

Since 2.0.12

StopMode Cgu::Thread::TaskManager::get_stop_mode ( ) const

Gets the current StopMode setting (either Cgu::Thread::TaskManager::wait_for_running or Cgu::Thread::TaskManager::wait_for_all) executed when running stop_all() or when the destructor is called. See the documentation on stop_all() for an explanation of the setting. This value is established initially by the 'mode' argument passed to the TaskManager constructor and can subequently be changed by calling set_stop_mode(). This method will not throw and is thread safe.

Returns
The current StopMode setting.

Since 2.0.12

unsigned int Cgu::Thread::TaskManager::get_tasks ( ) const

Gets the number of tasks which the TaskManager object is at present either running in the thread pool or has queued for execution. This value will be less than the number returned by get_used_threads() if threads in the thread pool are currently waiting to receive tasks for execution. This method will not throw and is thread safe.

Returns
The number of tasks either running or queued for execution.

Since 2.0.12

unsigned int Cgu::Thread::TaskManager::get_used_threads ( ) const

Gets the number of threads which the TaskManager object is currently running in the thread pool, including those blocking waiting for a task. This value could be greater than the number returned by get_max_threads() if set_max_threads() has recently been called with a value which is less than that number but not enough tasks have since completed to reduce the number of running threads to the new value set. This method will not throw and is thread safe.

Returns
The number of threads running in the thread pool, including those blocking waiting for a task.

Since 2.0.12

bool Cgu::Thread::TaskManager::is_error ( ) const

This will return true if a thread required by the thread pool has failed to start correctly because of memory exhaustion or because pthread has run out of other resources to start new threads, or because an internal operation has thrown std::bad_alloc. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, and even more so where glib is used, as that terminates a program if memory cannot be obtained from the operating system, but there may be some specialized cases where the return value of this method is useful - this class does not use any glib functions which might cause such termination.) This method will not throw and is thread safe.

Since 2.0.12

template<class Ret , class Func >
void Cgu::Thread::TaskManager::make_task_compose ( Func &&  f,
GMainContext *  context,
std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when 
)
inline

This is an abbreviated version of make_task_when_full(), which is for use when it is known that the function represented by the callable object passed to this method, and the copy constructors of any non-reference bound arguments passed to it, do not throw, and the user is not interested in std::bad_alloc and does not need a Cgu::Releaser object for the 'when' callback (which is likely to cover the majority of uses, particularly when composing tasks using glib because glib terminates the program if it is unable to obtain memory).

From version 2.0.14, this method takes the callable object as a template parameter, and in version 2.0.13 it took it as a std::function object. In version 2.0.13 it was necessary to specify the return value of any callable object which was not a std::function object as a specific template parameter: this is not necessary in version 2.0.14, as it is deduced automatically.

This method does the same as the version of make_task_when() taking a function object, except that this method takes the callable object to be executed as a task as its first argument and the 'when' callback as its last argument in order to aid task composition, and in particular so tasks compose in user code in a visually ordered manner.

More particularly, like make_task_when_full(), this method is a wrapper which will take a callable object representing a function which returns a value, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

The 'when' callback will execute with G_PRIORITY_DEFAULT priority in the main loop.

Parameters
fThe callable object to be executed as a task.
contextThe glib main context of the main loop in which the 'when' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
whenA callback which will be executed if and when the function represented by the callable object passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of the callable object throws.
2. If the callable object passed as an argument has both const and non-const operator()() methods, the non-const version will be called even if the callable object passed is a const object.
3. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class... Params, class... Args, class T >
Cgu::SharedLockPtr<Cgu::AsyncResult<Ret> > Cgu::Thread::TaskManager::make_task_result ( T &  t,
Ret(T::*)(Params...)  func,
Args &&...  args 
)

This is a wrapper which will take a member function pointer to a member function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and returns a Cgu::AsyncResult object (held by Cgu::SharedLockPtr) which will provide the value that the function returns. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

This method can take up to three bound arguments for the target member function.

If the function passed to this method exits by throwing Thread::Exit or some other exception, then the returned Cgu::AsyncResult object's get() method will unblock and its get_error() method will return -1.

Parameters
tThe object whose member function passed to this method is to execute as a task.
funcThe member function to be executed as a task.
argsThe arguments to be passed to that member function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
This method will also throw if the copy or move constructor of a bound argument throws.

Since 2.0.13

template<class Ret , class... Params, class... Args, class T >
Cgu::SharedLockPtr<Cgu::AsyncResult<Ret> > Cgu::Thread::TaskManager::make_task_result ( const T &  t,
Ret(T::*)(Params...) const  func,
Args &&...  args 
)

This is a wrapper which will take a member function pointer to a member function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and returns a Cgu::AsyncResult object (held by Cgu::SharedLockPtr) which will provide the value that the function returns. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

This method can take up to three bound arguments for the target member function.

If the function passed to this method exits by throwing Thread::Exit or some other exception, then the returned Cgu::AsyncResult object's get() method will unblock and its get_error() method will return -1.

Parameters
tThe object whose member function passed to this method is to execute as a task.
funcThe member function to be executed as a task.
argsThe arguments to be passed to that member function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
This method will also throw if the copy or move constructor of a bound argument throws.

Since 2.0.13

template<class Ret , class... Params, class... Args>
Cgu::SharedLockPtr<Cgu::AsyncResult<Ret> > Cgu::Thread::TaskManager::make_task_result ( Ret(*)(Params...)  func,
Args &&...  args 
)

This is a wrapper which will take a pointer to a function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and returns a Cgu::AsyncResult object (held by Cgu::SharedLockPtr) which will provide the value that the function returns. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

This method can take up to four bound arguments for the target function.

If the function passed to this method exits by throwing Thread::Exit or some other exception, then the returned Cgu::AsyncResult object's get() method will unblock and its get_error() method will return -1.

Parameters
funcThe function to be executed as a task.
argsThe arguments to be passed to that function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
This method will also throw if the copy or move constructor of a bound argument throws.

Since 2.0.13

template<class Ret , class Func >
Cgu::SharedLockPtr<Cgu::AsyncResult<Ret> > Cgu::Thread::TaskManager::make_task_result ( Func &&  f)

This is a wrapper which will take a callable object (such as a std::function object, a lambda or the return value of std::bind) representing a function which returns a value, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and returns a Cgu::AsyncResult object (held by Cgu::SharedLockPtr) which will provide the value that the function returns. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

From version 2.0.14, this method takes the callable object as a template parameter, and in version 2.0.13 it took it as a std::function object. In version 2.0.13 it was necessary to specify the return value of any callable object which was not a std::function object as a specific template parameter: this is not necessary in version 2.0.14, as it is deduced automatically.

If the function passed to this method exits by throwing Thread::Exit or some other exception, then the returned Cgu::AsyncResult object's get() method will unblock and its get_error() method will return -1.

Parameters
fThe callable object to be executed as a task.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of the callable object throws.
2. If the callable object passed as an argument has both const and non-const operator()() methods, the non-const version will be called even if the callable object passed is a const object.

Since 2.0.13

template<class Ret , class... Params, class... Args, class T >
void Cgu::Thread::TaskManager::make_task_when ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
GMainContext *  context,
T &  t,
Ret(T::*)(Params...)  func,
Args &&...  args 
)
inline

This is an abbreviated version of make_task_when_full(), which is for use when it is known that the member function passed to this method, and the copy constructors of any non-reference bound arguments passed to it, do not throw, and the user is not interested in std::bad_alloc and does not need a Cgu::Releaser object for the 'when' callback (which is likely to cover the majority of uses, particularly when composing tasks using glib because glib terminates the program if it is unable to obtain memory).

This method can take up to three bound arguments for the target member function.

Like make_task_when_full(), this method is a wrapper which will take a member function pointer to a member function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the member function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

The 'when' callback will execute with G_PRIORITY_DEFAULT priority in the main loop.

Parameters
whenA callback which will be executed if and when the function passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
contextThe glib main context of the main loop in which the 'when' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
tThe object whose member function passed to this method is to execute as a task.
funcThe member function to be executed as a task.
argsThe arguments to be passed to that member function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of a bound argument throws.
2. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class... Params, class... Args, class T >
void Cgu::Thread::TaskManager::make_task_when ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
GMainContext *  context,
const T &  t,
Ret(T::*)(Params...) const  func,
Args &&...  args 
)
inline

This is an abbreviated version of make_task_when_full(), which is for use when it is known that the member function passed to this method, and the copy constructors of any non-reference bound arguments passed to it, do not throw, and the user is not interested in std::bad_alloc and does not need a Cgu::Releaser object for the 'when' callback (which is likely to cover the majority of uses, particularly when composing tasks using glib because glib terminates the program if it is unable to obtain memory).

This method can take up to three bound arguments for the target member function.

Like make_task_when_full(), this method is a wrapper which will take a member function pointer to a member function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the member function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

The 'when' callback will execute with G_PRIORITY_DEFAULT priority in the main loop.

Parameters
whenA callback which will be executed if and when the function passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
contextThe glib main context of the main loop in which the 'when' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
tThe object whose member function passed to this method is to execute as a task.
funcThe member function to be executed as a task.
argsThe arguments to be passed to that member function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of a bound argument throws.
2. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class... Params, class... Args>
void Cgu::Thread::TaskManager::make_task_when ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
GMainContext *  context,
Ret(*)(Params...)  func,
Args &&...  args 
)
inline

This is an abbreviated version of make_task_when_full(), which is for use when it is known that the function passed to this method, and the copy constructors of any non-reference bound arguments passed to it, do not throw, and the user is not interested in std::bad_alloc and does not need a Cgu::Releaser object for the 'when' callback (which is likely to cover the majority of uses, particularly when composing tasks using glib because glib terminates the program if it is unable to obtain memory).

This method can take up to four bound arguments for the target function.

Like make_task_when_full(), this method is a wrapper which will take a pointer to a function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

The 'when' callback will execute with G_PRIORITY_DEFAULT priority in the main loop.

Parameters
whenA callback which will be executed if and when the function passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
contextThe glib main context of the main loop in which the 'when' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
funcThe function to be executed as a task.
argsThe arguments to be passed to that function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of a bound argument throws.
2. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class Func >
void Cgu::Thread::TaskManager::make_task_when ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
GMainContext *  context,
Func &&  f 
)
inline

This is an abbreviated version of make_task_when_full(), which is for use when it is known that the function represented by the callable object passed to this method, and the copy constructors of any non-reference bound arguments passed to it, do not throw, and the user is not interested in std::bad_alloc and does not need a Cgu::Releaser object for the 'when' callback (which is likely to cover the majority of uses, particularly when composing tasks using glib because glib terminates the program if it is unable to obtain memory).

From version 2.0.14, this method takes the callable object as a template parameter, and in version 2.0.13 it took it as a std::function object. In version 2.0.13 it was necessary to specify the return value of any callable object which was not a std::function object as a specific template parameter: this is not necessary in version 2.0.14, as it is deduced automatically.

Like make_task_when_full(), this method is a wrapper which will take a callable object representing a function which returns a value, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

The 'when' callback will execute with G_PRIORITY_DEFAULT priority in the main loop.

There is a similar make_task_compose() function which has the callable object to be executed as a task as its first argument and the 'when' callback as its last argument, in order to aid task composition.

Parameters
whenA callback which will be executed if and when the function represented by the callable object passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
contextThe glib main context of the main loop in which the 'when' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
fThe callable object to be executed as a task.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of the callable object throws.
2. If the callable object passed as an argument has both const and non-const operator()() methods, the non-const version will be called even if the callable object passed is a const object.
3. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class... Params, class... Args, class T >
void Cgu::Thread::TaskManager::make_task_when_full ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
Cgu::Releaser when_releaser,
std::unique_ptr< const Cgu::Callback::Callback fail,
Cgu::Releaser fail_releaser,
gint  priority,
GMainContext *  context,
T &  t,
Ret(T::*)(Params...)  func,
Args &&...  args 
)

This is a wrapper which will take a member function pointer to a member function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the member function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

This method can take up to three bound arguments for the target member function.

Note that unlike add_task(), but like the 'fail' callback of Cgu::Thread::Future objects, if a fail callback is provided to this method and it executes, it will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.

Note also that if releasers are provided for the 'when' or 'fail' callbacks, these are passed by pointer and not by reference (this is so that a NULL pointer can indicate that no releaser is to be provided). If provided, a releaser will enable automatic disconnection of the 'when' or 'fail' callback, if the object having the callback function as a member is destroyed. For this to be race free, the lifetime of that object must be controlled by the thread in whose main loop the 'when' or 'fail' callback will execute.

The make_task_when() method is similar to this method but provides an abbreviated set of paramaters suitable for most cases. This method is for use where releasers or a 'fail' callback are required.

Parameters
whenA callback which will be executed if and when the function passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
when_releaserA pointer to a releaser object for automatic disconnection of the 'when' callback if the object of which the callback function is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
failA callback which will be executed if the 'when' callback does not execute. This would happen if the function passed to this method exits by throwing Thread::Exit or some other exception or the copy constructor of a non-reference argument of that function throws, or if the 'when' callback does not execute because the internal implementation of this wrapper throws std::bad_alloc (which will not happen if the library has been installed using the –with-glib-memory-slices-no-compat configuration option: instead glib will terminate the program if it is unable to obtain memory from the operating system). If an exception propagates from the function represented by the 'fail' callback, this will be consumed to protect the TaskManager object, and a g_critical() warning will be issued. The callback will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method. An empty std::unique_ptr object indicates no 'fail' callback.
fail_releaserA pointer to a releaser object for automatic disconnection of the 'fail' callback if the object of which the callback function is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
priorityThe priority to be given in the main loop to the 'when' callback or any 'fail' callback. In ascending order of priorities, priorities are G_PRIORITY_LOW, G_PRIORITY_DEFAULT_IDLE, G_PRIORITY_HIGH_IDLE, G_PRIORITY_DEFAULT and G_PRIORITY_HIGH. This determines the order in which the callback will appear in the event list in the main loop, not the priority which the OS will adopt.
contextThe glib main context of the main loop in which the 'when' callback or any 'fail' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
tThe object whose member function passed to this method is to execute as a task.
funcThe member function to be executed as a task.
argsThe arguments to be passed to that member function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of a bound argument throws.
2. If a 'when_releaser' or a 'fail_releaser' argument is provided, it is in theory possible (if memory is exhausted and the system throws in that case) that an internal SafeEmitterArg object will throw std::bad_alloc when emitting/executing the 'when' or 'fail' callback in the glib main loop, with the result that the relevant callback will not execute (instead the exception will be consumed and a g_critical() warning will be issued). This is rarely of any relevance because glib will abort the program if it is itself unable to obtain memory from the operating system. However, where it is relevant, design the program so that it is not necessary to provide a releaser object.
3. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class... Params, class... Args, class T >
void Cgu::Thread::TaskManager::make_task_when_full ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
Cgu::Releaser when_releaser,
std::unique_ptr< const Cgu::Callback::Callback fail,
Cgu::Releaser fail_releaser,
gint  priority,
GMainContext *  context,
const T &  t,
Ret(T::*)(Params...) const  func,
Args &&...  args 
)

This is a wrapper which will take a member function pointer to a member function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the member function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

This method can take up to three bound arguments for the target member function.

Note that unlike add_task(), but like the 'fail' callback of Cgu::Thread::Future objects, if a fail callback is provided to this method and it executes, it will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.

Note also that if releasers are provided for the 'when' or 'fail' callbacks, these are passed by pointer and not by reference (this is so that a NULL pointer can indicate that no releaser is to be provided). If provided, a releaser will enable automatic disconnection of the 'when' or 'fail' callback, if the object having the callback function as a member is destroyed. For this to be race free, the lifetime of that object must be controlled by the thread in whose main loop the 'when' or 'fail' callback will execute.

The make_task_when() method is similar to this method but provides an abbreviated set of paramaters suitable for most cases. This method is for use where releasers or a 'fail' callback are required.

Parameters
whenA callback which will be executed if and when the function passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
when_releaserA pointer to a releaser object for automatic disconnection of the 'when' callback if the object of which the callback function is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
failA callback which will be executed if the 'when' callback does not execute. This would happen if the function passed to this method exits by throwing Thread::Exit or some other exception or the copy constructor of a non-reference argument of that function throws, or if the 'when' callback does not execute because the internal implementation of this wrapper throws std::bad_alloc (which will not happen if the library has been installed using the –with-glib-memory-slices-no-compat configuration option: instead glib will terminate the program if it is unable to obtain memory from the operating system). If an exception propagates from the function represented by the 'fail' callback, this will be consumed to protect the TaskManager object, and a g_critical() warning will be issued. The callback will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method. An empty std::unique_ptr object indicates no 'fail' callback.
fail_releaserA pointer to a releaser object for automatic disconnection of the 'fail' callback if the object of which the callback function is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
priorityThe priority to be given in the main loop to the 'when' callback or any 'fail' callback. In ascending order of priorities, priorities are G_PRIORITY_LOW, G_PRIORITY_DEFAULT_IDLE, G_PRIORITY_HIGH_IDLE, G_PRIORITY_DEFAULT and G_PRIORITY_HIGH. This determines the order in which the callback will appear in the event list in the main loop, not the priority which the OS will adopt.
contextThe glib main context of the main loop in which the 'when' callback or any 'fail' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
tThe object whose member function passed to this method is to execute as a task.
funcThe member function to be executed as a task.
argsThe arguments to be passed to that member function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of a bound argument throws.
2. If a 'when_releaser' or a 'fail_releaser' argument is provided, it is in theory possible (if memory is exhausted and the system throws in that case) that an internal SafeEmitterArg object will throw std::bad_alloc when emitting/executing the 'when' or 'fail' callback in the glib main loop, with the result that the relevant callback will not execute (instead the exception will be consumed and a g_critical() warning will be issued). This is rarely of any relevance because glib will abort the program if it is itself unable to obtain memory from the operating system. However, where it is relevant, design the program so that it is not necessary to provide a releaser object.
3. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class... Params, class... Args>
void Cgu::Thread::TaskManager::make_task_when_full ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
Cgu::Releaser when_releaser,
std::unique_ptr< const Cgu::Callback::Callback fail,
Cgu::Releaser fail_releaser,
gint  priority,
GMainContext *  context,
Ret(*)(Params...)  func,
Args &&...  args 
)

This is a wrapper which will take a pointer to a function which returns a value, together with arguments, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

This method can take up to four bound arguments for the target function.

Note that unlike add_task(), but like the 'fail' callback of Cgu::Thread::Future objects, if a fail callback is provided to this method and it executes, it will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.

Note also that if releasers are provided for the 'when' or 'fail' callbacks, these are passed by pointer and not by reference (this is so that a NULL pointer can indicate that no releaser is to be provided). If provided, a releaser will enable automatic disconnection of the 'when' or 'fail' callback, if the object of which the releaser is a member is destroyed. For this to be race free, the lifetime of that object must be controlled by the thread in whose main loop the 'when' or 'fail' callback will execute.

The make_task_when() method is similar to this method but provides an abbreviated set of paramaters suitable for most cases. This method is for use where releasers or a 'fail' callback are required.

Parameters
whenA callback which will be executed if and when the function passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
when_releaserA pointer to a releaser object for automatic disconnection of the 'when' callback if the object of which the releaser object is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
failA callback which will be executed if the 'when' callback does not execute. This would happen if the function passed to this method exits by throwing Thread::Exit or some other exception or the copy constructor of a non-reference argument of that function throws, or if the 'when' callback does not execute because the internal implementation of this wrapper throws std::bad_alloc (which will not happen if the library has been installed using the –with-glib-memory-slices-no-compat configuration option: instead glib will terminate the program if it is unable to obtain memory from the operating system). If an exception propagates from the function represented by the 'fail' callback, this will be consumed to protect the TaskManager object, and a g_critical() warning will be issued. The callback will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method. An empty std::unique_ptr object indicates no 'fail' callback.
fail_releaserA pointer to a releaser object for automatic disconnection of the 'fail' callback if the object of which the releaser object is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
priorityThe priority to be given in the main loop to the 'when' callback or any 'fail' callback. In ascending order of priorities, priorities are G_PRIORITY_LOW, G_PRIORITY_DEFAULT_IDLE, G_PRIORITY_HIGH_IDLE, G_PRIORITY_DEFAULT and G_PRIORITY_HIGH. This determines the order in which the callback will appear in the event list in the main loop, not the priority which the OS will adopt.
contextThe glib main context of the main loop in which the 'when' callback or any 'fail' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
funcThe function to be executed as a task.
argsThe arguments to be passed to that function.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of a bound argument throws.
2. If a 'when_releaser' or a 'fail_releaser' argument is provided, it is in theory possible (if memory is exhausted and the system throws in that case) that an internal SafeEmitterArg object will throw std::bad_alloc when emitting/executing the 'when' or 'fail' callback in the glib main loop, with the result that the relevant callback will not execute (instead the exception will be consumed and a g_critical() warning will be issued). This is rarely of any relevance because glib will abort the program if it is itself unable to obtain memory from the operating system. However, where it is relevant, design the program so that it is not necessary to provide a releaser object.
3. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

template<class Ret , class Func >
void Cgu::Thread::TaskManager::make_task_when_full ( std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >>  when,
Cgu::Releaser when_releaser,
std::unique_ptr< const Cgu::Callback::Callback fail,
Cgu::Releaser fail_releaser,
gint  priority,
GMainContext *  context,
Func &&  f 
)

This is a wrapper which will take a callable object (such as a std::function object, a lambda or the return value of std::bind) representing a function which returns a value, and constructs a TaskManager task which will execute that function by calling add_task() with an appropriate callback object, and causes the 'when' callback passed as an argument to this method to be executed by a glib main loop if and when the task finishes correctly - the 'when' callback is passed the function's return value when it is invoked. It is thread safe (any thread may call this method, including another task running on the TaskManager object). Apart from the absence of a 'one thread per task' model, this method therefore provides a similar interface to the one provided by Cgu::Thread::Future. See the documentation on add_task() for further information about how task execution works.

From version 2.0.14, this method takes the callable object as a template parameter, and in version 2.0.13 it took it as a std::function object. In version 2.0.13 it was necessary to specify the return value of any callable object which was not a std::function object as a specific template parameter: this is not necessary in version 2.0.14, as it is deduced automatically.

Note that unlike add_task(), but like the 'fail' callback of Cgu::Thread::Future objects, if a fail callback is provided to this method and it executes, it will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.

Note also that if releasers are provided for the 'when' or 'fail' callbacks, these are passed by pointer and not by reference (this is so that a NULL pointer can indicate that no releaser is to be provided). If provided, a releaser will enable automatic disconnection of the 'when' or 'fail' callback, if the object of which the releaser is a member is destroyed. For this to be race free, the lifetime of that object must be controlled by the thread in whose main loop the 'when' or 'fail' callback will execute.

The make_task_when() method is similar to this method but provides an abbreviated set of paramaters suitable for most cases. This method is for use where releasers or a 'fail' callback are required.

Parameters
whenA callback which will be executed if and when the function represented by the callable object passed to this method finishes correctly. The callback is passed that function's return value when it is invoked. It will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method.
when_releaserA pointer to a releaser object for automatic disconnection of the 'when' callback if the object of which the releaser object is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
failA callback which will be executed if the 'when' callback does not execute. This would happen if the function represented by the std::function object passed to this method exits by throwing Thread::Exit or some other exception or the copy constructor of a non-reference argument of that function throws, or if the 'when' callback does not execute because the internal implementation of this wrapper throws std::bad_alloc (which will not happen if the library has been installed using the –with-glib-memory-slices-no-compat configuration option: instead glib will terminate the program if it is unable to obtain memory from the operating system). If an exception propagates from the function represented by the 'fail' callback, this will be consumed to protect the TaskManager object, and a g_critical() warning will be issued. The callback will execute in the glib main loop whose GMainContext object is passed to the 'context' argument of this method. An empty std::unique_ptr object indicates no 'fail' callback.
fail_releaserA pointer to a releaser object for automatic disconnection of the 'fail' callback if the object of which the releaser object is a member is destroyed. A value of 0/NULL/nullptr indicates no releaser.
priorityThe priority to be given in the main loop to the 'when' callback or any 'fail' callback. In ascending order of priorities, priorities are G_PRIORITY_LOW, G_PRIORITY_DEFAULT_IDLE, G_PRIORITY_HIGH_IDLE, G_PRIORITY_DEFAULT and G_PRIORITY_HIGH. This determines the order in which the callback will appear in the event list in the main loop, not the priority which the OS will adopt.
contextThe glib main context of the main loop in which the 'when' callback or any 'fail' callback is to be executed. A value 0/NULL/nullptr will cause the callback to be executed in the main program loop.
fThe callable object to be executed as a task.
Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the sytem throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called. It will also be thrown if is_error() would return true because this class's internal thread pool loop implementation has thrown std::bad_alloc, or a thread has failed to start correctly. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion, but there may be some specialized cases where the return value of is_error() is useful.)
Note
1. This method will also throw if the copy or move constructor of the callable object throws.
2. If the callable object passed as an argument has both const and non-const operator()() methods, the non-const version will be called even if the callable object passed is a const object.
3. If a 'when_releaser' or a 'fail_releaser' argument is provided, it is in theory possible (if memory is exhausted and the system throws in that case) that an internal SafeEmitterArg object will throw std::bad_alloc when emitting/executing the 'when' or 'fail' callback in the glib main loop, with the result that the relevant callback will not execute (instead the exception will be consumed and a g_critical() warning will be issued). This is rarely of any relevance because glib will abort the program if it is itself unable to obtain memory from the operating system. However, where it is relevant, design the program so that it is not necessary to provide a releaser object.
4. If the library is compiled using the --with-auto-ptr configuration option, then this method uses std::auto_ptr in place of std::unique_ptr in its signature in order to retain compatibility with the 1.2 series of the library.

Since 2.0.13

TaskManager& Cgu::Thread::TaskManager::operator= ( const TaskManager )
delete

This class cannot be copied. The assignment operator is deleted.

void Cgu::Thread::TaskManager::set_blocking ( bool  blocking)

Sets the current blocking setting, which determines whether calls to stop_all() and the destructor will block waiting for all remaining tasks to complete. This method cannot be called after stop_all() has been called (if that is attempted, Cgu::Thread::TaskError will be thrown). It is thread safe.

Parameters
blockingThe new blocking setting.
Exceptions
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called.

Since 2.0.12

void Cgu::Thread::TaskManager::set_idle_time ( unsigned int  idle)

Sets the length of time in milliseconds that threads greater in number than the minimum and not executing any tasks will remain in existence waiting for new tasks. This will only have effect for threads in the pool which begin waiting for new tasks after this method is called. This method will not throw and is thread safe.

Parameters
idleThe length of the idle time in milliseconds during which threads will remain waiting for new tasks.

Since 2.0.12

void Cgu::Thread::TaskManager::set_max_threads ( unsigned int  max)

Sets the maximum number of threads which the TaskManager object will currently run in the thread pool. If this is less than the current number of running threads, the number of threads actually running will only be reduced as tasks complete, or as idle timeouts expire. This method does nothing if stop_all() has previously been called. This method is thread safe.

Parameters
maxThe maximum number of threads which the TaskManager object will currently run in the thread pool. This method will not set the maximum value of threads to a value less than that returned by get_min_threads(), nor to a value less than 1.
Exceptions
std::bad_allocIf this call is passed a value for 'max' which increases the maximum number of threads from its previous setting and tasks are currently queued for execution, new threads will be started for the queued tasks, so this exception may be thrown on starting the new threads if memory is exhausted and the system throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorIf this call is passed a value for 'max' which increases the maximum number of threads from its previous setting and tasks are currently queued for execution, new threads will be started for the queued tasks, so this exception may be thrown on starting the new threads if a thread fails to start correctly (this would mean that memory is exhausted, the pthread thread limit has been reached or pthread has run out of other resources to start new threads).

Since 2.0.12

void Cgu::Thread::TaskManager::set_stop_mode ( StopMode  mode)

Sets the current StopMode setting (either Cgu::Thread::TaskManager::wait_for_running or Cgu::Thread::TaskManager::wait_for_all) executed when running stop_all() or when the destructor is called. See the documentation on stop_all() for an explanation of the setting. This method will not throw and is thread safe.

Parameters
modeThe new StopMode setting.

Since 2.0.12

void Cgu::Thread::TaskManager::stop_all ( )

This will cause the TaskManager object to stop running tasks. The precise effect depends on the current StopMode and blocking settings. If StopMode is set to Cgu::Thread::TaskManager::wait_for_running, all queued tasks which are not yet running on a thread will be dispensed with, but any already running will be left to complete normally. If StopMode is set to Cgu::Thread::TaskManager::wait_for_all, both already running tasks and all tasks already queued will be permitted to execute and complete normally. If the blocking setting is set to true, this method will wait until all the tasks still to execute have finished before returning, and if false it will return straight away.

After this method has been called, any attempt to add further tasks with the add_task() method will fail, and add_task() will throw Cgu::Thread::TaskError.

This method is thread safe (any thread may call it) unless the blocking setting is true, in which case no task running on the TaskManager object may call this method.

Exceptions
std::bad_allocThis exception will be thrown if memory is exhausted and the system throws in that case. (On systems with over-commit/lazy-commit combined with virtual memory (swap), it is rarely useful to check for memory exhaustion).
Cgu::Thread::TaskErrorThis exception will be thrown if stop_all() has previously been called, unless that previous call threw std::bad_alloc: if std::bad_alloc is thrown, this method may be called again to stop all threads, once the memory deficiency is dealt with, but no other methods of the TaskManager object should be called.

Since 2.0.12


The documentation for this class was generated from the following file: