Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <iostream>
- #include "thread_local.hpp"
- #include <twist/stdlike/atomic.hpp>
- #include <twist/threading/spin_wait.hpp>
- namespace solutions {
- class RCULock {
- public:
- void ReadLock() {
- tickets_->fetch_add(1);
- }
- void ReadUnlock() {
- tickets_->fetch_add(1);
- }
- void Synchronize() {
- size_t i = 0;
- std::vector<size_t> v;
- for (auto& ticket : tickets_) {
- v.push_back(ticket.load());
- }
- twist::SpinWait spin_wait;
- for (auto& ticket : tickets_) {
- while (v[i] % 2 == 1 && ticket.load() == v[i]) {
- spin_wait();
- }
- i++;
- }
- }
- void lock_shared() { // NOLINT
- ReadLock();
- }
- void unlock_shared() { // NOLINT
- ReadUnlock();
- }
- private:
- ThreadLocal<twist::atomic<size_t>> tickets_;
- };
- } // namespace solutions
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement