53 lines
971 B
C++
53 lines
971 B
C++
|
#pragma once
|
||
|
|
||
|
#include <queue>
|
||
|
#include <mutex>
|
||
|
#include <condition_variable>
|
||
|
|
||
|
/// Thread safe queue
|
||
|
template <class T>
|
||
|
class safe_queue {
|
||
|
private:
|
||
|
std::queue<T> queue;
|
||
|
std::mutex mutex;
|
||
|
std::condition_variable cv;
|
||
|
|
||
|
public:
|
||
|
void push(const T& in) {
|
||
|
std::unique_lock<std::mutex> lock(mutex);
|
||
|
queue.push(in);
|
||
|
cv.notify_one();
|
||
|
}
|
||
|
|
||
|
bool pop(T& out) {
|
||
|
std::unique_lock<std::mutex> lock(mutex);
|
||
|
if (queue.empty())
|
||
|
return false;
|
||
|
|
||
|
out = queue.front();
|
||
|
queue.pop();
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool empty() {
|
||
|
std::unique_lock<std::mutex> lock(mutex);
|
||
|
return queue.empty();
|
||
|
}
|
||
|
|
||
|
size_t size() {
|
||
|
std::unique_lock<std::mutex> lock(mutex);
|
||
|
return queue.size();
|
||
|
}
|
||
|
|
||
|
void notify() {
|
||
|
cv.notify_all();
|
||
|
}
|
||
|
|
||
|
void wait() {
|
||
|
std::unique_lock<std::mutex> lock(mutex);
|
||
|
if(queue.empty())
|
||
|
cv.wait(lock);
|
||
|
}
|
||
|
|
||
|
};
|