Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.84 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. #include "thread_local.hpp"
  4.  
  5. #include <twist/stdlike/atomic.hpp>
  6. #include <twist/threading/spin_wait.hpp>
  7.  
  8. namespace solutions {
  9.  
  10. class RCULock {
  11. public:
  12. void ReadLock() {
  13. tickets_->fetch_add(1);
  14. }
  15.  
  16. void ReadUnlock() {
  17. tickets_->fetch_add(1);
  18. }
  19.  
  20. void Synchronize() {
  21. size_t i = 0;
  22. std::vector<size_t> v;
  23. for (auto& ticket : tickets_) {
  24. v.push_back(ticket.load());
  25. }
  26. twist::SpinWait spin_wait;
  27. for (auto& ticket : tickets_) {
  28. while (v[i] % 2 == 1 && ticket.load() == v[i]) {
  29. spin_wait();
  30. }
  31. i++;
  32. }
  33. }
  34.  
  35. void lock_shared() { // NOLINT
  36. ReadLock();
  37. }
  38.  
  39. void unlock_shared() { // NOLINT
  40. ReadUnlock();
  41. }
  42.  
  43. private:
  44. ThreadLocal<twist::atomic<size_t>> tickets_;
  45. };
  46.  
  47. } // namespace solutions
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement