Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <atomic.hpp>
- #include <backoff.hpp>
- 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<size_t> next_free_ticket_{0}; // Номер ближайшего свободного ticket'a
- tpcc::atomic<size_t> owner_ticket_{0}; // Номер текущего
- // обрабатываемого ticket'a
- };
- } // namespace solutions
- } // namespace tpcc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement