|
ThreadSchedule 3.0.0
Modern C++ thread management library
|
High-performance thread pool optimized for high-frequency task submission. More...
#include <work_stealing_pool_backend.hpp>
Classes | |
| struct | statistics |
Public Types | |
| using | task_type = std::function< void()> |
| using | queued_task = detail::move_only_function< void()> |
Public Member Functions | |
| work_stealing_pool_backend (size_t num_threads=default_worker_count(), size_t deque_capacity=work_stealing_deque< queued_task >::default_capacity, bool register_workers=false) | |
| template<typename Bool , std::enable_if_t< std::is_same_v< std::decay_t< Bool >, bool >, int > = 0> | |
| work_stealing_pool_backend (size_t num_threads, Bool register_workers) | |
| work_stealing_pool_backend (work_stealing_pool_backend const &)=delete | |
| auto | operator= (work_stealing_pool_backend const &) -> work_stealing_pool_backend &=delete |
| ~work_stealing_pool_backend () | |
| void | shutdown (shutdown_policy_backend policy=shutdown_policy_backend::drain) |
| Shut the pool down. | |
| auto | shutdown_for (std::chrono::milliseconds timeout) -> bool |
Attempt a timed drain: finish as many tasks as possible within timeout, then discard queued work. | |
| template<typename F , typename... Args> | |
| auto | try_submit (F &&f, Args &&... args) -> expected< std::future< bind_result_t< F, Args... > >, std::error_code > |
| Submit a task without throwing on shutdown. | |
| template<typename F , typename... Args> | |
| auto | submit (F &&f, Args &&... args) -> std::future< bind_result_t< F, Args... > > |
| Submit a task, throwing on shutdown. | |
| template<typename F , typename... Args> | |
| void | post (F &&f, Args &&... args) |
| Fire-and-forget task submission (throwing variant). | |
| template<typename F , typename... Args> | |
| auto | try_post (F &&f, Args &&... args) -> expected< void, std::error_code > |
| Fire-and-forget task submission (non-throwing variant). | |
| template<typename Iterator > | |
| auto | try_submit_batch (Iterator begin, Iterator end) -> expected< std::vector< std::future< void > >, std::error_code > |
Submit a range of void() callables in one go (non-throwing). | |
| template<typename Iterator > | |
| auto | submit_batch (Iterator begin, Iterator end) -> std::vector< std::future< void > > |
Submit a range of void() callables in one go (throwing). | |
| template<typename Iterator , typename F > | |
| void | parallel_for_each (Iterator begin, Iterator end, F &&func) |
Apply func to every element in [begin, end) in parallel. | |
Observers | |
| auto | size () const noexcept -> size_t |
| Number of worker threads in this pool. | |
| auto | pending_tasks () const -> size_t |
| Approximate count of tasks waiting in all queues. | |
| auto | get_statistics () const -> statistics |
| Collect approximate performance counters. | |
Thread configuration | |
| auto | configure_threads (std::string const &name_prefix, native_scheduling_policy policy=native_scheduling_policy::other, native_thread_priority priority=native_thread_priority::normal()) -> expected< void, std::error_code > |
| Name, schedule and prioritize all worker threads. | |
| auto | configure_threads (native_thread_config const &config) -> expected< void, std::error_code > |
| auto | set_affinity (native_thread_affinity const &affinity) -> expected< void, std::error_code > |
| Pin all workers to the same CPU set. | |
| auto | distribute_across_cpus () -> expected< void, std::error_code > |
| Pin each worker to a distinct CPU core (round-robin). | |
Synchronisation | |
| void | wait_for_tasks () |
| Block until all pending and active tasks have completed. | |
| auto | is_current_worker () const noexcept -> bool |
Tracing hooks | |
| void | set_on_task_start (task_start_callback cb) |
| Register a callback invoked just before each task executes. | |
| template<typename Callback , std::enable_if_t<!std::is_same_v< detail::remove_cvref_t< Callback >, task_start_callback >, int > = 0> | |
| void | set_on_task_start (Callback &&cb) |
| void | set_on_task_end (task_end_callback cb) |
| Register a callback invoked just after each task completes. | |
| template<typename Callback , std::enable_if_t<!std::is_same_v< detail::remove_cvref_t< Callback >, task_end_callback >, int > = 0> | |
| void | set_on_task_end (Callback &&cb) |
High-performance thread pool optimized for high-frequency task submission.
Uses a work-stealing architecture: each worker thread owns a private work_stealing_deque, and idle workers attempt to steal tasks from other workers' queues. A shared overflow queue absorbs bursts when all per-thread queues are full.
Optimizations for 1k+ tasks with 10k+ tasks/second throughput:
Definition at line 122 of file work_stealing_pool_backend.hpp.
| using threadschedule::detail::work_stealing_pool_backend::queued_task = detail::move_only_function<void()> |
Definition at line 126 of file work_stealing_pool_backend.hpp.
| using threadschedule::detail::work_stealing_pool_backend::task_type = std::function<void()> |
Definition at line 125 of file work_stealing_pool_backend.hpp.
|
inlineexplicit |
Definition at line 139 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::worker_startup_latch::wait().
|
inline |
Definition at line 172 of file work_stealing_pool_backend.hpp.
|
delete |
|
inline |
Definition at line 180 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::drain, and shutdown().
|
inline |
Definition at line 627 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::configure_worker_threads(), and threadschedule::detail::runtime_registry().
|
inline |
Name, schedule and prioritize all worker threads.
Each worker is named name_prefix + "_0", "_1", etc.
expected<void, std::error_code> - error if the OS rejected any configuration call. Definition at line 618 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::configure_worker_threads(), and threadschedule::detail::runtime_registry().
|
inline |
Pin each worker to a distinct CPU core (round-robin).
Definition at line 641 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::distribute_workers_across_cpus().
|
inline |
Collect approximate performance counters.
Definition at line 570 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::work_stealing_pool_backend::statistics::active_threads, threadschedule::detail::work_stealing_pool_backend::statistics::avg_task_time, threadschedule::detail::work_stealing_pool_backend::statistics::completed_tasks, threadschedule::detail::work_stealing_pool_backend::statistics::pending_tasks, pending_tasks(), threadschedule::detail::work_stealing_pool_backend::statistics::stolen_tasks, threadschedule::detail::work_stealing_pool_backend::statistics::tasks_per_second, and threadschedule::detail::work_stealing_pool_backend::statistics::total_threads.
|
inlinenoexcept |
Definition at line 662 of file work_stealing_pool_backend.hpp.
Referenced by parallel_for_each(), shutdown(), shutdown_for(), and wait_for_tasks().
|
delete |
|
inline |
Apply func to every element in [begin, end) in parallel.
The range is split into chunks and submitted as tasks. Blocks until all elements have been processed.
| Iterator | Forward iterator; task chunks retain iterator pairs. |
Definition at line 536 of file work_stealing_pool_backend.hpp.
References is_current_worker(), threadschedule::detail::parallel_for_each_chunked(), and threadschedule::detail::throw_worker_deadlock().
|
inline |
Approximate count of tasks waiting in all queues.
Definition at line 555 of file work_stealing_pool_backend.hpp.
Referenced by get_statistics().
|
inline |
Fire-and-forget task submission (throwing variant).
Enqueues a callable without creating a std::packaged_task or std::future, giving roughly 3x higher throughput than submit() for tasks whose return value is not needed.
| std::runtime_error | If the pool is shutting down. |
Definition at line 370 of file work_stealing_pool_backend.hpp.
References try_post().
|
inline |
Pin all workers to the same CPU set.
Definition at line 634 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::set_worker_affinity().
|
inline |
Definition at line 710 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::make_copyable_function().
|
inline |
Register a callback invoked just after each task completes.
| cb | Receives the end time, the worker's std::thread::id, and the wall-clock duration of the task. |
Definition at line 701 of file work_stealing_pool_backend.hpp.
|
inline |
Definition at line 686 of file work_stealing_pool_backend.hpp.
|
inline |
Register a callback invoked just before each task executes.
| cb | Receives the start time and the worker's std::thread::id. |
Definition at line 677 of file work_stealing_pool_backend.hpp.
|
inline |
Shut the pool down.
| policy | drain (default) finishes all queued tasks; drop_pending discards queued tasks. |
Definition at line 192 of file work_stealing_pool_backend.hpp.
References is_current_worker(), and threadschedule::detail::throw_worker_deadlock().
Referenced by ~work_stealing_pool_backend().
|
inline |
Attempt a timed drain: finish as many tasks as possible within timeout, then discard queued work.
New submissions are rejected before the timed wait begins. Running C++ callables cannot be stopped safely, so this function can return after the timeout while an already-running task finishes.
true if all tasks completed within the deadline, false if the timeout expired first. Definition at line 216 of file work_stealing_pool_backend.hpp.
References is_current_worker(), threadschedule::detail::shutdown_deadline_after(), and threadschedule::detail::throw_worker_deadlock().
|
inlinenoexcept |
Number of worker threads in this pool.
Definition at line 548 of file work_stealing_pool_backend.hpp.
|
inline |
Submit a task, throwing on shutdown.
Equivalent to try_submit but throws std::runtime_error instead of returning an error code when the pool is shutting down.
| std::runtime_error | If the pool is shutting down. |
std::future<R> that becomes ready when the task completes. Definition at line 350 of file work_stealing_pool_backend.hpp.
References threadschedule::expected< T, E >::has_value(), try_submit(), and threadschedule::expected< T, E >::value().
|
inline |
Submit a range of void() callables in one go (throwing).
| std::runtime_error | If the pool is shutting down. |
Definition at line 519 of file work_stealing_pool_backend.hpp.
References threadschedule::expected< T, E >::has_value(), try_submit_batch(), and threadschedule::expected< T, E >::value().
|
inline |
Fire-and-forget task submission (non-throwing variant).
expected<void, std::error_code> – std::errc::operation_canceled on shutdown. Definition at line 385 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::bind_args(), and threadschedule::detail::make_move_only_function().
Referenced by post().
|
inline |
Submit a task without throwing on shutdown.
Wraps the callable in a std::packaged_task and enqueues it. Returns an expected containing the std::future on success, or std::errc::operation_canceled if the pool is shutting down.
| F | Callable type. |
| Args | Argument types forwarded to F. |
| f | Callable to execute. |
| args | Arguments forwarded to f. |
expected<std::future<R>, std::error_code> where R is the result of invoking the stored, decayed callable and arguments.Definition at line 286 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::bind_args().
Referenced by submit().
|
inline |
Submit a range of void() callables in one go (non-throwing).
Acquires the lock once per batch, distributing tasks across worker queues in round-robin fashion. Significantly more efficient than calling submit() in a loop for large batches.
| Iterator | Input iterator whose value_type is callable as void(). |
expected containing a vector of futures, or std::errc::operation_canceled on shutdown. Definition at line 448 of file work_stealing_pool_backend.hpp.
References threadschedule::detail::multipass_range_size().
Referenced by submit_batch().
|
inline |
Block until all pending and active tasks have completed.
Definition at line 653 of file work_stealing_pool_backend.hpp.
References is_current_worker(), and threadschedule::detail::throw_worker_deadlock().