63 static std::unique_ptr<JobSystem>
make();
82 template<
typename MyJobFunction,
typename... Arguments>
83 auto AddWork(MyJobFunction&& function, Arguments&&... params) -> std::future<
decltype(function(params...))>;
91 std::vector<std::thread> workers_;
92 std::mutex queue_mutex_;
93 std::condition_variable warner_job_avaliable_;
94 std::queue<std::function<void()>> work_queue_;
107 inline auto JobSystem::AddWork(MyJobFunction&& function, Arguments && ...params) -> std::future<
decltype(function(params...))>
109 auto packet = [function = std::move(function), ...params = std::move(params)](){
return function(params...); };
110 std::lock_guard lock{queue_mutex_};
112 using work_type =
decltype(function(params...));
113 auto return_type = std::make_shared<std::packaged_task<work_type()>>(packet);
115 std::future<work_type> f = return_type->get_future();
116 work_queue_.push([return_type](){(*return_type)();});
117 warner_job_avaliable_.notify_one();