///////////////////////////////////////////////////////////////////// // Task.cpp - Enqueue work item to run on a threadpool thread // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2016 // ///////////////////////////////////////////////////////////////////// #include "Task.h" #include "../Utilities/Utilities.h" #include "../Logger/Logger.h" #include #include using namespace Async; using Rslt = Logging::StaticLogger<0>; using Demo = Logging::StaticLogger<1>; using Dbug = Logging::StaticLogger<2>; ThreadPool Task::trpl_; // declare static member size_t Task::numThrds_ = 0; Task::Task(size_t numThrds) { if (numThrds_ == 0) { numThrds_ = numThrds; trpl_.start(numThrds); } } std::mutex& Task::mutex() { return trpl_.mutex(); } void Task::workItem(CallObj co) { trpl_.workItem(co); } void Task::wait() { trpl_.wait(); } //----< test stub >-------------------------------------------------- #ifdef TEST_TASK #include using namespace std::chrono_literals; using namespace Utilities; using Utils = StringHelper; int main() { Utils::Title("Testing Task Class"); Rslt::attach(&std::cout); Rslt::start(); Demo::attach(&std::cout); Demo::start(); Task tsk(6); Task::CallObj co = [&tsk]() ->bool { Rslt::write( "\n hello from thread " + Utilities::Converter::toString(std::this_thread::get_id()) ); std::this_thread::sleep_for(5ms); return true; }; for (size_t i = 0; i < 20; ++i) { tsk.workItem(co); } Task::CallObj exit = []() ->bool { return false; }; tsk.workItem(exit); tsk.wait(); } #endif