Program Listing for File Atomic_Double_Buffer.hpp
↰ Return to documentation for file (include\global\DataLines\Atomic_Double_Buffer.hpp)
#pragma once
#include <atomic>
#include <cstddef>
#include <vector>
template <typename T> class Atomic_Double_Buffer {
private:
std::vector<T> first;
std::vector<T> second;
std::atomic_flag lock = ATOMIC_FLAG_INIT;
bool acc_first = true;
public:
explicit Atomic_Double_Buffer(const std::size_t reserve_size)
{
first.reserve(reserve_size);
second.reserve(reserve_size);
lock.clear(std::memory_order_relaxed);
}
~Atomic_Double_Buffer() = default;
void
Write(const T &data)
{
while (lock.test_and_set(std::memory_order_acquire)) {
}
if (acc_first) {
first.push_back(data);
} else {
second.push_back(data);
}
lock.clear(std::memory_order_release);
}
std::vector<T> *
Get()
{
while (lock.test_and_set(std::memory_order_acquire)) {
}
if (acc_first) {
second.clear();
} else {
first.clear();
}
acc_first = !acc_first;
lock.clear(std::memory_order_release);
if (acc_first) {
return &second;
}
return &first;
}
};