barrier.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // ======================================================================== //
  2. // Copyright 2009-2019 Intel Corporation //
  3. // //
  4. // Licensed under the Apache License, Version 2.0 (the "License"); //
  5. // you may not use this file except in compliance with the License. //
  6. // You may obtain a copy of the License at //
  7. // //
  8. // http://www.apache.org/licenses/LICENSE-2.0 //
  9. // //
  10. // Unless required by applicable law or agreed to in writing, software //
  11. // distributed under the License is distributed on an "AS IS" BASIS, //
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
  13. // See the License for the specific language governing permissions and //
  14. // limitations under the License. //
  15. // ======================================================================== //
  16. #pragma once
  17. #include "platform.h"
  18. #include <mutex>
  19. #include <condition_variable>
  20. namespace oidn {
  21. class Barrier
  22. {
  23. private:
  24. std::mutex m;
  25. std::condition_variable cv;
  26. volatile int count;
  27. public:
  28. Barrier(int count) : count(count) {}
  29. void wait()
  30. {
  31. std::unique_lock<std::mutex> lk(m);
  32. count--;
  33. if (count == 0)
  34. {
  35. lk.unlock();
  36. cv.notify_all();
  37. }
  38. else
  39. {
  40. cv.wait(lk, [&]{ return count == 0; });
  41. }
  42. }
  43. };
  44. } // namespace oidn