17 template <
typename Task,
typename Result>
21 JobRunner(
unsigned threadCount = 1) : threadCount_(threadCount) {}
31 std::vector<std::thread> threads;
32 for (
unsigned i = 0; i < threadCount_; ++i) {
33 threads.emplace_back([
this, &timeout] {
43 std::lock_guard<std::mutex> guard(lock_);
45 task = std::move(*newTask);
52 Result result =
Run(std::move(task));
56 std::lock_guard<std::mutex> guard(lock_);
57 Post(std::move(result));
63 for (std::thread &thread : threads) {
71 virtual std::optional<Task>
Request() = 0;
74 virtual Result
Run(Task &&task) = 0;
77 virtual void Post(Result &&result) = 0;
81 unsigned threadCount_;