//----------------------------------------------- // ballhausen.h: fair solution //----------------------------------------------- #ifndef ballhausen_h #define ballhausen_h //----------------------------------------------- #include // std::size_t #include // std::mutex #include // std::counting_semaphore //----------------------------------------------- class ballhausen_lock { public: ballhausen_lock(std::size_t w): writers(w), semaphore(writers) {} void reader_lock() { semaphore.acquire(); } void reader_unlock() { semaphore.release(); } void writer_lock() { std::unique_lock lock(mutex); for (std::size_t i = 0; i < writers; ++i) semaphore.acquire(); } void writer_unlock() { for (std::size_t i = 0; i < writers; ++i) semaphore.release(); } private: std::size_t writers; std::mutex mutex; std::counting_semaphore<> semaphore; }; //----------------------------------------------- #endif // ballhausen_h