1
0
Files
nure/semester-4/ОС/lb-8/src/task-1/queue.hpp
Sytnyk Yehor e79109c81a OS lb-8
2025-05-30 22:55:57 +03:00

46 lines
813 B
C++

#pragma once
#include <condition_variable>
#include <mutex>
#include <optional>
#include <queue>
namespace th_safe {
template <typename T> class queue {
public:
void push(const T &value) {
{
std::lock_guard lock(mutex_);
queue_.push(value);
}
cond_var_.notify_one();
}
std::optional<T> pop() {
std::unique_lock lock(mutex_);
cond_var_.wait(lock, [this] { return !queue_.empty() || done_; });
if (queue_.empty())
return std::nullopt;
T value = queue_.front();
queue_.pop();
return value;
}
void done() {
{
std::lock_guard lock(mutex_);
done_ = true;
}
cond_var_.notify_all();
}
private:
std::queue<T> queue_;
std::mutex mutex_;
std::condition_variable cond_var_;
bool done_ = false;
};
} // namespace th_safe