//----------------------------------------------- // stallings.h: reader-priority //----------------------------------------------- #ifndef stallings_h #define stallings_h //----------------------------------------------- #include // std::size_t #include // std::*_semaphore //----------------------------------------------- class stallings_lock { public: stallings_lock(std::size_t): reader_sem(1), writer_sem(1), readers(0) {} void reader_lock() { reader_sem.acquire(); if (++readers == 1) writer_sem.acquire(); reader_sem.release(); } void reader_unlock() { reader_sem.acquire(); if (--readers == 0) writer_sem.release(); reader_sem.release(); } void writer_lock() { writer_sem.acquire(); } void writer_unlock() { writer_sem.release(); } private: std::binary_semaphore reader_sem, writer_sem; std::size_t readers; }; //----------------------------------------------- #endif // stallings_h