``` GLOB_MUTEX and R_MUTEX semaphores init. at 1 R a shared register init. at 0 begin_read() := PR_MUTEX.down() R_MUTEX.down() R++ # currently active readers if R = 1 then W_MUTEX.down() GLOB_MUTEX.down() R_MUTEX.up() PR_MUTEX.up() return end_read() := R_MUTEX.down() R-- if R = 0 then GLOB_MUTEX.up() R_MUTEX.up() return begin_write() := W_MUTEX.down() W_MUTEX.up() PR_MUTEX.down() GLOB_MUTEX.down() return end_write() := PR_MUTEX.up() GLOB_MUTEX.up() return ```