Advertisement
MystMe

Untitled

Mar 1st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.95 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.     size_t owner = owner_ticket_.load();
  23.     return next_free_ticket_.compare_exchange_weak(owner, owner_ticket_.load()+1);
  24.   }
  25.  
  26.   // don't change this method
  27.   void Unlock() {
  28.     owner_ticket_.store(owner_ticket_.load() + 1);
  29.   }
  30.  
  31.  private:
  32.   tpcc::atomic<size_t> next_free_ticket_{0}; // Номер ближайшего свободного ticket'a
  33.   tpcc::atomic<size_t> owner_ticket_{0};  // Номер текущего
  34.                                           // обрабатываемого ticket'a
  35. };
  36.  
  37. } // namespace solutions
  38. } // namespace tpcc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement