27 throw std::runtime_error(
"Thread pool thread count is 0!");
29 for (
int i = 0; i < n; ++i)
30 m_threads.emplace_back(std::thread(&ThreadPool::loop,
this));
37 std::unique_lock lock(m_mutex);
38 m_jobs.push(std::move(job));
45 std::future<void> addBatch(std::vector<Job> batch) {
46 auto promise = std::make_shared<std::promise<void>>();
47 auto remainingJobs = std::make_shared<std::atomic<size_t>>(batch.size());
48 std::future<void> future = promise->get_future();
50 for (
const auto& job : batch) {
51 add([job = std::move(job), promise, remainingJobs]() {
54 if (remainingJobs->fetch_sub(1) == 1) {
60 if (batch.size() == 0) {
69 std::unique_lock lock(m_mutex);
74 for (
auto& t : m_threads) {
80 void resume() { m_pause =
false; }
82 void pause() { m_pause =
true; }
87 SetThreadDescription(GetCurrentThread(), L
"ThreadPool");
92 std::unique_lock lock(m_mutex);
93 m_cv.wait(lock, [
this] {
return !m_jobs.empty() || m_terminate || m_pause; });
103 job = m_jobs.front();
109 bool m_terminate =
false;
110 bool m_pause =
false;
111 std::condition_variable m_cv;
114 std::vector<std::thread> m_threads;
115 std::queue<Job> m_jobs;