Advertisement
MystMe

Untitled

Feb 20th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <vector>
  4.  
  5. namespace tpcc {
  6.     namespace solutions {
  7.  
  8.         class TournamentTreeLock {
  9.         public:
  10.             explicit TournamentTreeLock(size_t num_threads) {
  11.               num = num_threads;
  12.               levels.assign(num_threads, 0);
  13.               victim.resize(num_threads, 0);
  14.             }
  15.  
  16.             void Lock(size_t thread_index) {
  17.               for (size_t level = 1; level < num; level++) {
  18.                 levels[thread_index] = level;
  19.                 victim[level] = thread_index;
  20.  
  21.                 bool conflicts_exist = true;
  22.                 while(conflicts_exist) {
  23.                   conflicts_exist = false;
  24.                   for(int another_thread = 1; another_thread < num; another_thread++) {
  25.                     if(another_thread!=thread_index && levels[another_thread] >= level && victim[level] == thread_index) {
  26.                       conflicts_exist = true;
  27.                       break;
  28.                     }
  29.                   }
  30.                 }
  31.               }
  32.             }
  33.             void Unlock(size_t thread_index) {
  34.               levels[thread_index] = 0;
  35.             }
  36.  
  37.         private:
  38.             size_t num;
  39.             std::vector<size_t> levels;
  40.             std::vector<size_t> victim;
  41.         };
  42.  
  43.     } // namespace solutions
  44. } // namespace tpcc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement