1 #ifndef OSMSCOUT_UTIL_WORKQUEUE_H 2 #define OSMSCOUT_UTIL_WORKQUEUE_H 23 #include <condition_variable> 38 using Task = std::packaged_task<R ()>;
42 std::condition_variable pushCondition;
43 std::condition_variable popCondition;
44 std::deque<Task> tasks;
45 size_t queueLimit=std::numeric_limits<size_t>::max();
65 : queueLimit(queueLimit)
76 std::unique_lock lock(mutex);
78 pushCondition.wait(lock,[
this]{
return tasks.size()<=queueLimit;});
80 tasks.push_back(std::move(task));
82 popCondition.notify_one();
88 std::unique_lock lock(mutex);
90 popCondition.wait(lock,[
this]{
return !tasks.empty() || !running;});
97 task=std::move(tasks.front());
100 pushCondition.notify_one();
108 std::scoped_lock<std::mutex> lock(mutex);
112 popCondition.notify_all();
void PushTask(Task &task)
Definition: WorkQueue.h:74
void Stop()
Definition: WorkQueue.h:106
Definition: WorkQueue.h:35
bool PopTask(Task &task)
Definition: WorkQueue.h:86