Advertisement
den4ik2003

Untitled

Mar 6th, 2023
2,724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.88 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <twist/ed/stdlike/atomic.hpp>
  4. #include <twist/ed/wait/sys.hpp>
  5.  
  6. #include <cstdlib>
  7.  
  8. namespace stdlike {
  9.  
  10. class Mutex {
  11.  public:
  12.   Mutex() = default;
  13.  
  14.   Mutex(Mutex&) = delete;
  15.  
  16.   void Lock() {
  17.     uint32_t compare = 0;
  18.     while ((compare = ++locked_threads_count) != 1) {
  19.  
  20.       twist::ed::Wait(locked_threads_count, compare);
  21.  
  22.       locked_threads_count.fetch_sub(1);
  23.     }
  24.   }
  25.  
  26.   void Unlock() {
  27.     auto wake_key = twist::ed::PrepareWake(locked_threads_count);
  28.     auto prev_atom = locked_threads_count.fetch_sub(1);
  29.     // Если между этими строчками придёт поток, то всё будет ок, тк он захватится
  30.     if (prev_atom > 1) {
  31.       twist::ed::WakeOne(wake_key);
  32.     }
  33.   }
  34.  
  35.  private:
  36.   twist::ed::stdlike::atomic<uint32_t> locked_threads_count{0};
  37. };
  38.  
  39. }  // namespace stdlike
  40.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement