Методи lock() і unlock() закривають і відкривають блокування в режимі запису, а lockR() і unlockR() — у режимі читання. Блокування повинно гарантувати:
ексклюзивність доступу для запису: після виклику lock() усі виклики lock() і lockR() блокують потік до виклику unlock().
спільний доступ для читання: після виклику lockR() наступні виклики lockR() не блокують потік (але див. наступний пункт!).
неможливість «голодування» записувача читачами: після виклику lockR() і (блокувального) lock() подальші виклики lockR() мають блокувати потік до моменту, коли потік-записувач викличе unlock().
4. робота повністю в просторі користувача за відсутності конфліктів: якщо на блокування не претендує жоден записувач, або рівно один записувач і жодного читача, виклики всіх методів не повинні звертатися до операційної системи.
Можна припустити, що виклики lock() і unlock(), а також lockR() і unlockR() будуть відповідно спаровані в межах потоків, не використовуватимуться рекурсивно, а кількість потоків, що одночасно утримують блокування в режимі читання, не перевищить 2^30.
Окрім стандартних заголовків C++17, можна використати файли futex.h, xlock.h та semaphore.h, які містять відповідно реалізації футекса, виключного блокування (аналог <mutex>, але з гарантією відсутності зайвих системних викликів) та необмеженого семафора.