24class HighPerformancePoolWithErrors
27 explicit HighPerformancePoolWithErrors(
size_t num_threads = std::thread::hardware_concurrency())
28 : pool_(num_threads), error_handler_(std::make_shared<ErrorHandler>())
35 template <
typename F,
typename... Args>
38 auto handler = error_handler_;
39 auto wrapped_task = [f = std::forward<F>(f), args = std::make_tuple(std::forward<Args>(args)...), handler]() {
42 return std::apply(f, args);
47 error.
exception = std::current_exception();
48 error.
thread_id = std::this_thread::get_id();
49 error.
timestamp = std::chrono::steady_clock::now();
50 handler->handle_error(error);
55 auto future = pool_.submit(std::move(wrapped_task));
62 template <
typename F,
typename... Args>
66 auto handler = error_handler_;
67 auto wrapped_task = [f = std::forward<F>(f), args = std::make_tuple(std::forward<Args>(args)...), handler,
71 return std::apply(f, args);
76 error.
exception = std::current_exception();
78 error.
thread_id = std::this_thread::get_id();
79 error.
timestamp = std::chrono::steady_clock::now();
80 handler->handle_error(error);
85 auto future = pool_.submit(std::move(wrapped_task));
94 return error_handler_->add_callback(std::move(callback));
102 error_handler_->clear_callbacks();
110 return error_handler_->error_count();
118 error_handler_->reset_error_count();
140 auto configure_threads(std::string
const& name_prefix, SchedulingPolicy policy = SchedulingPolicy::OTHER,
143 return pool_.configure_threads(name_prefix, policy, priority);
148 return pool_.set_affinity(affinity);
151 auto distribute_across_cpus() -> expected<void, std::error_code>
153 return pool_.distribute_across_cpus();
161 void wait_for_tasks()
163 pool_.wait_for_tasks();
166 [[nodiscard]]
auto size() const noexcept ->
size_t
171 [[nodiscard]]
auto pending_tasks() const ->
size_t
173 return pool_.pending_tasks();
177 HighPerformancePool pool_;
178 std::shared_ptr<ErrorHandler> error_handler_;
191class FastThreadPoolWithErrors
194 explicit FastThreadPoolWithErrors(
size_t num_threads = std::thread::hardware_concurrency())
195 : pool_(num_threads), error_handler_(std::make_shared<ErrorHandler>())
199 template <
typename F,
typename... Args>
202 auto handler = error_handler_;
203 auto wrapped_task = [f = std::forward<F>(f), args = std::make_tuple(std::forward<Args>(args)...), handler]() {
206 return std::apply(f, args);
211 error.
exception = std::current_exception();
212 error.
thread_id = std::this_thread::get_id();
213 error.
timestamp = std::chrono::steady_clock::now();
214 handler->handle_error(error);
219 auto future = pool_.submit(std::move(wrapped_task));
223 template <
typename F,
typename... Args>
224 auto submit_with_description(std::string
const& description, F&& f, Args&&... args)
227 auto handler = error_handler_;
228 auto wrapped_task = [f = std::forward<F>(f), args = std::make_tuple(std::forward<Args>(args)...), handler,
232 return std::apply(f, args);
237 error.
exception = std::current_exception();
239 error.
thread_id = std::this_thread::get_id();
240 error.
timestamp = std::chrono::steady_clock::now();
241 handler->handle_error(error);
246 auto future = pool_.submit(std::move(wrapped_task));
250 auto add_error_callback(ErrorCallback callback) ->
size_t
252 return error_handler_->add_callback(std::move(callback));
255 void clear_error_callbacks()
257 error_handler_->clear_callbacks();
260 [[nodiscard]]
auto error_count()
const ->
size_t
262 return error_handler_->error_count();
265 void reset_error_count()
267 error_handler_->reset_error_count();
277 return pool_.get_statistics();
280 auto configure_threads(std::string
const& name_prefix, SchedulingPolicy policy = SchedulingPolicy::OTHER,
283 return pool_.configure_threads(name_prefix, policy, priority);
288 return pool_.set_affinity(affinity);
291 auto distribute_across_cpus() ->
bool
293 return pool_.distribute_across_cpus();
296 void wait_for_tasks()
298 pool_.wait_for_tasks();
306 [[nodiscard]]
auto size()
const noexcept ->
size_t
311 [[nodiscard]]
auto pending_tasks()
const ->
size_t
313 return pool_.pending_tasks();
318 std::shared_ptr<ErrorHandler> error_handler_;
331class ThreadPoolWithErrors
334 explicit ThreadPoolWithErrors(
size_t num_threads = std::thread::hardware_concurrency())
335 : pool_(num_threads), error_handler_(std::make_shared<ErrorHandler>())
339 template <
typename F,
typename... Args>
342 auto handler = error_handler_;
343 auto wrapped_task = [f = std::forward<F>(f), args = std::make_tuple(std::forward<Args>(args)...), handler]() {
346 return std::apply(f, args);
351 error.
exception = std::current_exception();
352 error.
thread_id = std::this_thread::get_id();
353 error.
timestamp = std::chrono::steady_clock::now();
354 handler->handle_error(error);
359 auto future = pool_.submit(std::move(wrapped_task));
363 template <
typename F,
typename... Args>
364 auto submit_with_description(std::string
const& description, F&& f, Args&&... args)
367 auto handler = error_handler_;
368 auto wrapped_task = [f = std::forward<F>(f), args = std::make_tuple(std::forward<Args>(args)...), handler,
372 return std::apply(f, args);
377 error.
exception = std::current_exception();
379 error.
thread_id = std::this_thread::get_id();
380 error.
timestamp = std::chrono::steady_clock::now();
381 handler->handle_error(error);
386 auto future = pool_.submit(std::move(wrapped_task));
390 auto add_error_callback(ErrorCallback callback) ->
size_t
392 return error_handler_->add_callback(std::move(callback));
395 void clear_error_callbacks()
397 error_handler_->clear_callbacks();
400 [[nodiscard]]
auto error_count()
const ->
size_t
402 return error_handler_->error_count();
405 void reset_error_count()
407 error_handler_->reset_error_count();
417 return pool_.get_statistics();
420 auto configure_threads(std::string
const& name_prefix, SchedulingPolicy policy = SchedulingPolicy::OTHER,
423 return pool_.configure_threads(name_prefix, policy, priority);
428 return pool_.set_affinity(affinity);
431 auto distribute_across_cpus() ->
bool
433 return pool_.distribute_across_cpus();
436 void wait_for_tasks()
438 pool_.wait_for_tasks();
446 [[nodiscard]]
auto size()
const noexcept ->
size_t
451 [[nodiscard]]
auto pending_tasks()
const ->
size_t
453 return pool_.pending_tasks();
458 std::shared_ptr<ErrorHandler> error_handler_;