#pragma once #include #include #include #include namespace exe::support { // Test-and-TAS spinlock class SpinLock { public: void Lock() { while (is_locked_.exchange(true, std::memory_order::acquire)) { twist::util::SpinWait s; while (is_locked_.load(std::memory_order::relaxed)) { s.Spin(); } } } void Unlock() { is_locked_.store(false, std::memory_order::release); } // BasicLockable void lock() { // NOLINT Lock(); } void unlock() { // NOLINT Unlock(); } private: twist::stdlike::atomic is_locked_{false}; }; } // namespace exe::support