mp-sfml/include/thread_queue.h

42 lines
895 B
C
Raw Normal View History

2024-09-30 13:34:05 +08:00
#include <queue>
#include <mutex>
#include <condition_variable>
template <typename T>
class ThreadQueue {
public:
ThreadQueue() = default;
~ThreadQueue() = default;
void push(const T& value) {
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, [this](){ return queue_.size() <= maxSize; });
2024-09-30 13:34:05 +08:00
queue_.push(value);
condition_.notify_one();
}
T pop() {
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, [this] { return !queue_.empty(); });
T value = queue_.front();
queue_.pop();
condition_.notify_one();
2024-09-30 13:34:05 +08:00
return value;
}
bool empty() const {
std::lock_guard<std::mutex> lock(mutex_);
return queue_.empty();
}
size_t size() const {
std::lock_guard<std::mutex> lock(mutex_);
return queue_.size();
}
private:
std::queue<T> queue_;
mutable std::mutex mutex_;
std::condition_variable condition_;
unsigned int maxSize = 50;
2024-09-30 13:34:05 +08:00
};