// Author Phillip Johnston // Licensed under CC0 1.0 Universal // https://github.com/embeddedartistry/embedded-resources/blob/master/examples/cpp/dispatch.cpp // https://embeddedartistry.com/blog/2017/2/1/dispatch-queues?rq=dispatch #pragma once #include #include #include #include #include #include #include #include namespace sta { class DispatchQueue { typedef std::function fp_t; public: DispatchQueue(size_t thread_cnt); ~DispatchQueue(); void setThreadCount(size_t thread_count); // Dispatch and copy. void dispatch(const fp_t& op); // Dispatch and move. void dispatch(fp_t&& op); void finishTasks(); // Deleted operations DispatchQueue(const DispatchQueue& rhs) = delete; DispatchQueue& operator=(const DispatchQueue& rhs) = delete; DispatchQueue(DispatchQueue&& rhs) = delete; DispatchQueue& operator=(DispatchQueue&& rhs) = delete; private: void dispatch_thread_handler(size_t i); void terminateThreads(); std::mutex lock_; std::vector threads_; std::queue q_; std::condition_variable cv_; std::atomic pending_task_count_; bool quit_ = false; }; } // namespace