#pragma once #include #include #include #include // #include // #include template class workThread { public: void init(std::vector & ops) { this->ops = ops; t = std::thread([this]{ threadLoop(); }); } void threadLoop() { //std::unique_lock lk(m); for (;;) { while(true) { std::lock_guard lg(m); if (job != -1) break; }; // std::cout << "loop!" << "\n"; // cv.wait(lk, [this]{ // // std::cout << "wake up!!! you have work to do: " << job << "\n"; // return job != -1; // }); if (job == -2) { break; } // TODO run job ops[job]->Run(); job = -1; cv.notify_one(); } } void run(int i) { std::lock_guard lk(m); job = i; cv.notify_one(); } void join() { std::unique_lock lk(m); cv.wait(lk, [this]{ return job == -1; }); } void quit() { { std::cout << "try get lock!!!\n"; std::lock_guard lk(m); std::cout << "set job = -2\n"; job = -2; cv.notify_one(); } t.join(); std::cout << "job quit\n"; } private: std::vector ops; // std::queue> q; int job = -1; // std::atomic job; std::condition_variable cv; std::mutex m; std::thread t; // bool idle = false; };