1#ifndef THREADSAFEQUEUE_H
2#define THREADSAFEQUEUE_H
18#include <condition_variable>
29 explicit ThreadsafeQueue(std::string name =
"default",
size_t maxSize = 100000);
37 size_t Pop(T& output,
int millisecond_wait = 1000);
72 : fName(std::move(name)), max_queue_size(maxSize), is_finished(false)
79 std::unique_lock<std::mutex> lock(mutex);
80 if(queue.size() > max_queue_size) {
95 std::unique_lock<std::mutex> lock(mutex);
96 if(!queue.size() && millisecond_wait) {
97 can_pop.wait_for(lock, std::chrono::milliseconds(millisecond_wait));
104 output = queue.front();
110 can_push.notify_one();
118 std::unique_lock<std::mutex> lock(mutex);
119 return items_in_queue;
125 std::unique_lock<std::mutex> lock(mutex);
132 std::unique_lock<std::mutex> lock(mutex);
146 is_finished = finished;
std::atomic_int num_writers
void SetFinished(bool finished=true)
ThreadsafeQueue(const ThreadsafeQueue &)=default
std::atomic_bool is_finished
size_t ItemsPushed() const
size_t ItemsPopped() const
std::condition_variable can_pop
ThreadsafeQueue(std::string name="default", size_t maxSize=100000)
ThreadsafeQueue(ThreadsafeQueue &&) noexcept=default
std::condition_variable can_push
size_t Pop(T &output, int millisecond_wait=1000)