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) {
|
2024-09-30 16:11:07 +08:00
|
|
|
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();
|
2024-09-30 16:11:07 +08:00
|
|
|
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_;
|
2024-09-30 16:11:07 +08:00
|
|
|
unsigned int maxSize = 50;
|
2024-09-30 13:34:05 +08:00
|
|
|
};
|