BS_Praktikum4/ring_buffer.h
2025-06-03 01:25:44 +02:00

33 lines
754 B
C++

#pragma once
#include <array>
#include <mutex>
#include <condition_variable>
template <size_t N>
class RingBuffer {
std::array<int, N> data;
size_t read = 0;
size_t write = 0;
bool full = false;
std::mutex mtx;
std::condition_variable cv;
public:
void push(int value) {
std::lock_guard<std::mutex> lock(mtx);
data[write] = value;
write = (write + 1) % N;
if (full) read = (read + 1) % N;
full = (write == read);
cv.notify_one();
}
int pop() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this]{ return full || write != read; });
int val = data[read];
read = (read + 1) % N;
full = false;
return val;
}
};