I want to get a thread-pool behavior using TBB. But whenever I read documents about TBB they always talk about parallel-for, parallel-dowhile etc. In contrast what I need is a main thread to assign tasks to a thread pool so those tasks will be executed 'on their own' - execute tasks asynchronously. Tasks here can be event handling for a GUI.
Is the TBB task scheduler appropriate for such behavior? The impression I got from task scheduler is that it's only beneficial if I have tasks that can be broken down and executed in parallel to each other.
Starting from version 3.0, TBB has support for asynchronous execution of tasks. For that, a special work offering method tbb::task::enqueue()
was added. Unlike tbb::task::spawn()
, this method guarantees that the enqueued task will be executed even if the originating thread never enters a task dispatch method such as wait_for_all()
.
A short usage example for task::enqueue()
:
class MyTask : public tbb::task {
/*override*/ tbb::task* execute() {
// Do the job
return NULL; // or a pointer to a new task to be executed immediately
}
};
MyTask* t = new (tbb::task::allocate_root()) MyTask();
tbb::task::enqueue(*t);
// Do other job; the task will be executed asynchronously
As @JimMishell mentioned in the comment, an example how to use it for handling of GUI events can be found in "Design Patterns"; and the formal description of the method is available in the Reference manual (see TBB documentation for both).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With