23 #include <condition_variable>
37 for (
size_t i = 0; i < num_threads; ++i) {
38 _threads.emplace_back ([
this] {
40 std::function<void ()> task;
42 std::unique_lock<std::mutex> lock (_queue_lock);
44 _trigger.wait (lock, [
this] {
45 return !_queue.empty () || !_run;
48 if (!_run && _queue.empty ()) {
52 task = std::move (_queue.front ());
65 std::unique_lock<std::mutex> lock (_queue_lock);
69 _trigger.notify_all ();
71 for (
auto& thread : _threads) {
76 void push (std::function<
void ()> task)
79 std::unique_lock<std::mutex> lock (_queue_lock);
80 _queue.emplace (std::move (task));
82 _trigger.notify_one ();
87 std::queue<std::function<void ()>>
_queue;
std::vector< std::thread > _threads
ThreadPool(size_t num_threads)
void push(std::function< void()> task)
std::condition_variable _trigger
std::queue< std::function< void()> > _queue