Copperfield Engine 0.1
C++ Game Engine
Loading...
Searching...
No Matches
jobsystem.hpp
1#pragma once
2#include <chrono>
3#include <future>
4#include <iostream>
5#include <optional>
6#include <queue>
7#include <thread>
8
10class JobSystem {
11 public:
12 JobSystem();
13 ~JobSystem();
14
16 void work();
17
20 void set_stop(bool t);
21
25 template <class Funct, typename... Args>
26 auto addTask(Funct f, Args... a) -> std::future<decltype(f(a...))> {
27 using ret = decltype(f(a...));
28
29 std::function<ret()> fun = std::bind(f, a...);
30
31 return setFuture(fun);
32 }
33
34 private:
35 template <class Return>
36 std::future<Return> setFuture(std::function<Return()> func) {
37 std::shared_ptr<std::packaged_task<Return()>> task =
38 std::make_shared<std::packaged_task<Return()>>(std::move(func));
39
40 std::future<Return> future = task->get_future();
41 add([task]() { (*task)(); });
42 return future;
43 }
44
48 void add(std::function<void()> task);
49
50 bool stop_;
51 std::condition_variable condition_;
52 std::mutex mutex_;
53 std::vector<std::thread> workers_;
54 std::queue<std::function<void()>> jobs_;
55};