Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <twist/stdlike/mutex.hpp>
  4. #include <twist/stdlike/condition_variable.hpp>
  5. #include <twist/support/locking.hpp>
  6.  
  7. #include <cstddef>
  8.  
  9. namespace solutions {
  10.  
  11. class CyclicBarrier {
  12. public:
  13. explicit CyclicBarrier(size_t num_threads) : barrier_border_(num_threads) {
  14. threads_needed_cross_count_ = num_threads;
  15. threads_can_cross_count_[0] = threads_can_cross_count_[1] = 0;
  16. cur_queue_index_ = 0;
  17. }
  18.  
  19. void PassThrough() {
  20. auto barrier_lock = twist::LockUnique(barrier_mutex_);
  21. size_t local_cur_queue_index = cur_queue_index_;
  22.  
  23. --threads_needed_cross_count_;
  24.  
  25. if (threads_needed_cross_count_ == 0) {
  26. threads_can_cross_count_[cur_queue_index_] = barrier_border_ - 1;
  27.  
  28. threads_needed_cross_count_ = barrier_border_;
  29.  
  30. all_threads_are_here_.notify_all();
  31. cur_queue_index_ = 1 - cur_queue_index_;
  32. } else {
  33. while (threads_can_cross_count_[local_cur_queue_index] == 0) {
  34. all_threads_are_here_.wait(barrier_lock);
  35. }
  36. --threads_can_cross_count_[local_cur_queue_index];
  37. }
  38. }
  39.  
  40. private:
  41. twist::condition_variable all_threads_are_here_;
  42. twist::mutex barrier_mutex_;
  43. size_t threads_needed_cross_count_;
  44. const size_t barrier_border_;
  45. size_t threads_can_cross_count_[2];
  46.  
  47. size_t cur_queue_index_;
  48. };
  49.  
  50. } // namespace solutions
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement