NK
class Mutex {
public:
void Lock() {
for (std::size_t i = 0; locked_.load() || locked_.exchange(1); i++) {
if (i > 100) {
i = 0;
waiters_cnt_.fetch_add(1);
locked_.wait(1);
waiters_cnt_.fetch_sub(1);
}
}
}
void Unlock() {
locked_.store(false);
if (waiters_cnt_.load() > 0) {
locked_.notify_one();
}
}
private:
twist::stdlike::atomic<std::uint32_t> waiters_cnt_{0};
[[maybe_unused]] char padding1_[60];
twist::stdlike::atomic<std::uint32_t> locked_{0};
[[maybe_unused]] char padding2_[60];
};
