Advertisement
MystMe

Untitled

Feb 24th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.05 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <atomic.hpp>
  4. #include <backoff.hpp>
  5.  
  6. namespace tpcc {
  7. namespace solutions {
  8.  
  9. class TicketLock {
  10.  public:
  11.   // don't change this method
  12.   void Lock() {
  13.     const size_t this_thread_ticket = next_free_ticket_.fetch_add(1);
  14.  
  15.     Backoff backoff{};
  16.     while (this_thread_ticket != owner_ticket_.load()) {
  17.       backoff();
  18.     }
  19.   }
  20.  
  21.   bool TryLock() {
  22.     const size_t this_thread_ticket = next_free_ticket_.fetch_add(1);
  23.  
  24.     if (this_thread_ticket != owner_ticket_.load()) {
  25.       owner_ticket_.store(owner_ticket_.load() + 1);
  26.       return false;
  27.     }
  28.     return true;
  29.   }
  30.  
  31.   // don't change this method
  32.   void Unlock() {
  33.     owner_ticket_.store(owner_ticket_.load() + 1);
  34.   }
  35.  
  36.  private:
  37.   tpcc::atomic<size_t> next_free_ticket_{0}; // Номер ближайшего свободного ticket'a
  38.   tpcc::atomic<size_t> owner_ticket_{0};  // Номер текущего
  39.                                           // обрабатываемого ticket'a
  40. };
  41.  
  42. } // namespace solutions
  43. } // namespace tpcc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement