Страницы

Поиск по вопросам

вторник, 11 июня 2019 г.

Использование std::shared_mutex и проблема “обделения” писателя

Допустим, есть несколько читателей и один писатель, которые имеют общий ресурс, контролируемый посредством std::shared_mutex. Как быть в ситуации, когда читатели читают ресурс не одновременно, а, скажем, по очереди, т.ч. мьютекс всегда удерживается через std::shared_lock<>(), и писатель не может записать новые данные в ресурс, т.е. не может пробиться через инструкцию std::unique_lock<>?
Тут приходит на ум логика решения, что попытка захвата мьютекса писателем должна иметь более высокий приоритет, чем у читателей, т.е. когда писатель хочет что-то записать - он оставляет "заявление", т.ч. никакие читатели не могут сделать shared_lock, а те, что уже сделали - доделывают свою работу и ожидают обновлений со стороны писателя. Когда писатель обновит данные - может сделать notify_all() через condition_variable, к примеру.
Не вполне понимаю, как реализовать "приоритет захвата" в коде + может имеются другие решения данной проблемы не через std::shared_mutex?
P.S. Натолкнулся на описание в стандартах алгоритма Терехова, в котором говорится о прохождении читателей/писателей через двое входов, на основе которых выставляется приоритет. Но не совсем его понял. А именно, пройдет ли писатель первый вход, когда на втором есть читатели и, если так, то не смогут ли новые читатели зайти на вход 1.


Ответ

Не знаю, как с приоритетами, а идея двух входов довольно очевидна.
Все делают эксклюзивный lock на E1. Получив его, читатели делают shared lock на E2, а писатели эксклюзивный. Получив lock на E2 и читатели и писатель тут же освобождают lock на E1.
Таким образом, писатель прошедший E1 будет блокировать всех пришедших после него читателей до тех пор, пока последний из совместно использующих E2 читатель не освободит E2.

Комментариев нет:

Отправить комментарий