15 auto wait_predicate()
const {
16 return [
this]{
return is_shutting_down || task_queue.empty(); };
21 : task_queue(task_queue)
23 worker_threads.reserve(thread_count);
24 for (
int i = 0; i < thread_count; i++) {
25 worker_threads.emplace_back([&,
this, i]() {
33 worker_pool(
const worker_pool&) =
delete;
34 worker_pool& operator=(
const worker_pool&) =
delete;
36 int thread_count()
const;
39 void enqueue_task(pending_task&&
task,
bool run_on_main_loop);
40 std::deque<pending_task> pop_main_loop_tasks();
46 template<
class Rep,
class Period>
47 bool wait_for(
const std::chrono::duration<Rep, Period>& timeout_duration) {
48 std::unique_lock<std::mutex> lock(mutex);
49 return all_done_condition_variable.wait_for(lock, timeout_duration, wait_predicate());
52 template<
class Clock,
class Duration>
53 bool wait_until(
const std::chrono::time_point<Clock, Duration>& timeout_time) {
54 std::unique_lock<std::mutex> lock(mutex);
55 return all_done_condition_variable.wait_until(lock, timeout_time, wait_predicate());
60 std::condition_variable task_condition_variable;
61 std::condition_variable all_done_condition_variable;
62 std::vector<std::thread> worker_threads;
64 bool is_shutting_down;