#pragma once #include #include #include #include #include #include #include namespace sccl { class ThreadPool { public: ThreadPool(size_t); ~ThreadPool(); // 将任务加入线程池队列并返回关联的future template auto enqueue(F&& f, Args&&... args) -> std::future::type> { using return_type = typename std::result_of::type; auto task = std::make_shared>(std::bind(std::forward(f), std::forward(args)...)); std::future res = task->get_future(); { pthread_mutex_lock(&queue_mutex); tasks.push([task]() { (*task)(); }); active_tasks++; // 新任务增加活动任务计数 pthread_mutex_unlock(&queue_mutex); pthread_cond_signal(&condition); } return res; } // 检查是否所有任务都已完成 bool allTasksCompleted(); private: std::vector workers; // 工作线程列表 std::queue> tasks; // 任务队列 pthread_mutex_t queue_mutex; // 保护任务队列的互斥锁 pthread_cond_t condition; // 用于线程间通信的条件变量 bool stop; // 标志位,指示线程池是否应该停止 int active_tasks; // 追踪活动任务的数量 static void* run(void* arg); }; } // namespace sccl