Designed for one writer and multiple readers
#include <atomic>
template<typename T>
class SeqLock {
std::atomic<size_t> seq_{0};
T data_;
public:
void write(const T& value) {
seq_.fetch_add(1, std::memory_order_acqurie);
data_ = value;
seq_.fetch_add(1, std::memory_order_release);
}
T read() const {
T copy;
size_t seq1, seq2;
do {
seq1 = seq_.load(std::memory_order_acquire);
copy = data_;
seq2 = seq_.load(std::memory_order_acquire);
} while (seq1 != seq2 || seq1 & 1);
return copy;
}
};Writer never blocks, readers are speculative, they copy in the data and validate
