#pragma once ///////////////////////////////////////////////////////////////////// // MT3Q7.h - Execution of Enqueued Callable Objects // // // // Jim Fawcett, CSE687 - Midterm Solution, Spring 2017 // ///////////////////////////////////////////////////////////////////// #include #include #include "../Cpp11-BlockingQueue/Cpp11-BlockingQueue.h" template class Executor { public: using WorkItem = struct { CO co; CB cb; }; Executor(); void addWorkItem(WorkItem wi); void wait(); private: std::thread executeThread_; Async::BlockingQueue queue_; }; template Executor::Executor() { std::thread t( [&]() { while (true) { WorkItem wi = queue_.deQ(); if(!wi.co()) break; wi.cb(); } } ); executeThread_ = std::move(t); } template void Executor::addWorkItem(WorkItem wi) { queue_.enQ(wi); } template void Executor::wait() { executeThread_.join(); }