// // AsyncTaskQueue.hpp // Clock Signal // // Created by Thomas Harte on 07/10/2016. // Copyright © 2016 Thomas Harte. All rights reserved. // #ifndef AsyncTaskQueue_hpp #define AsyncTaskQueue_hpp #include #include #include #include namespace Concurrency { /*! An async task queue allows a caller to enqueue void(void) functions. Those functions are guaranteed to be performed serially and asynchronously from the caller. A caller may also request to synchronise, causing it to block until all previously-enqueued functions are complete. */ class AsyncTaskQueue { public: AsyncTaskQueue(); ~AsyncTaskQueue(); /*! Adds @c function to the queue. @discussion Functions will be performed serially and asynchronously. This method is safe to call from multiple threads. @parameter function The function to enqueue. */ void enqueue(std::function function); /*! Blocks the caller until all previously-enqueud functions have completed. */ void flush(); private: std::unique_ptr thread_; std::mutex queue_mutex_; std::list> pending_tasks_; std::condition_variable processing_condition_; std::atomic_bool should_destruct_; }; } #endif /* Concurrency_hpp */