#pragma once #include #include namespace tpcc { namespace solutions { class TicketLock { public: // don't change this method void Lock() { const size_t this_thread_ticket = next_free_ticket_.fetch_add(1); Backoff backoff{}; while (this_thread_ticket != owner_ticket_.load()) { backoff(); } } bool TryLock() { const size_t this_thread_ticket = next_free_ticket_.fetch_add(1); if (this_thread_ticket != owner_ticket_.load()) { owner_ticket_.store(owner_ticket_.load() + 1); return false; } return true; } // don't change this method void Unlock() { owner_ticket_.store(owner_ticket_.load() + 1); } private: tpcc::atomic next_free_ticket_{0}; // Номер ближайшего свободного ticket'a tpcc::atomic owner_ticket_{0}; // Номер текущего // обрабатываемого ticket'a }; } // namespace solutions } // namespace tpcc