1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-10 08:04:45 +00:00
CLK/Concurrency/AsyncTaskQueue.hpp

65 lines
1.4 KiB
C++
Raw Normal View History

//
// 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 <atomic>
#include <condition_variable>
#include <functional>
#include <list>
#include <memory>
#include <thread>
#ifdef __APPLE__
#include <dispatch/dispatch.h>
#endif
namespace Concurrency {
2016-10-07 21:18:46 +00:00
/*!
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 flush,
2016-10-07 21:18:46 +00:00
causing it to block until all previously-enqueued functions are complete.
*/
class AsyncTaskQueue {
public:
AsyncTaskQueue();
~AsyncTaskQueue();
2016-10-07 21:18:46 +00:00
/*!
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<void(void)> function);
2016-10-07 21:18:46 +00:00
/*!
Blocks the caller until all previously-enqueud functions have completed.
*/
void flush();
private:
#ifdef __APPLE__
dispatch_queue_t serial_dispatch_queue_;
#else
std::unique_ptr<std::thread> thread_;
std::mutex queue_mutex_;
std::list<std::function<void(void)>> pending_tasks_;
std::condition_variable processing_condition_;
2016-10-07 21:08:29 +00:00
std::atomic_bool should_destruct_;
#endif
};
}
#endif /* Concurrency_hpp */