//----------------------------------------------- // bacon.h: writer-priority //----------------------------------------------- #ifndef bacon_h #define bacon_h //----------------------------------------------- #include //----------------------------------------------- class bacon_lock { public: bacon_lock(int) : R(0), W(0), WGUARD(1), CGUARD(1), ar(0), rr(0), aw(0), ww(0) { } void reader_lock() { CGUARD.acquire(); ar = ar + 1; if (aw == 0) { rr = rr + 1; R.release(); } CGUARD.release(); R.acquire(); } void reader_unlock() { CGUARD.acquire(); rr = rr - 1; ar = ar - 1; if (rr == 0) while (ww < aw) { ww = ww + 1; W.release(); } CGUARD.release(); } void writer_lock() { CGUARD.acquire(); aw = aw + 1; if (rr == 0) { ww = ww + 1; W.release(); } CGUARD.release(); W.acquire(); WGUARD.acquire(); } void writer_unlock() { WGUARD.release(); CGUARD.acquire(); ww = ww - 1; aw = aw - 1; if (aw == 0) while (rr < ar) { rr = rr + 1; R.release(); } CGUARD.release(); } private: std::binary_semaphore R, // lecturas pendientes W, // escrituras pendientes WGUARD, // escritura exclusiva CGUARD; // exclusión contadores int ar, // lectores activos rr, // lectores leyendo aw, // escritores activos ww; // escritores escribiendo }; //----------------------------------------------- #endif // bacon_h