Advertisement
den4ik2003

Untitled

Mar 6th, 2023
916
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.87 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.     while (locked_threads_count.fetch_add(1) != 0) {
  18.  
  19.       twist::ed::Wait(locked_threads_count, locked_threads_count.load());
  20.  
  21.       locked_threads_count.fetch_sub(1);
  22.     }
  23.   }
  24.  
  25.   void Unlock() {
  26.     auto wake_key = twist::ed::PrepareWake(locked_threads_count);
  27.     auto prev_atom = locked_threads_count.fetch_sub(1);
  28.     // Если между этими строчками придёт поток, то всё будет ок, тк он захватится
  29.     if (prev_atom > 1) {
  30.       twist::ed::WakeOne(wake_key);
  31.     }
  32.   }
  33.  
  34.  private:
  35.   twist::ed::stdlike::atomic<uint32_t> locked_threads_count{0};
  36. };
  37.  
  38. }  // namespace stdlike
  39.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement