Как сделать мьютекс с приоритетами или RW-lock с эксклюзивным чтением?
Доброго времени суток!
Есть некоторая структура данных, к которой обращается малое число поставщиков данных и в несколько раз больше число потребителей. И поставщик данных, и потребитель требует эксклюзивной блокировки для своей работы, но если использовать обычный mutex, то в результате получается перекос в сторону потребителей, и поставщики данных начинают терять производительность.
Фактически необходимо три уровня приоритетов: shared - read-only операции, которые могут выполняться реально одновременно, не мешая друг другу; consume-exclusive - низкопроиоритетные операции, требующие эксклюзивной блокировки; produce-exclusive - высокоприоритетные операции, требующие эксклюзивной блокировки.
В принципе shared можно даже не выделять, а использовать consume-exclusive уровень для этих задач, так как они очень маленькие по ресурсоемкости (много меньше, чем другие операции).
Первой мыслью было взять boost::shared_mutex и внутри shared-блокировки использовать обычный mutex для разделения читателей, но тогда получится, что если на этом мутексе заблокируется читатель, и в этот момент придет писатель и начнет ждать уникальную блокировку, то вначале все равно отработает читатель, и только после того, как он освободит shared-блокировку, писатель сможет приступить к работе.
Как-либо менять приоритеты потоков или воздействовать на планировщика ОС нельзя, так как эти потоки еще много другой работы выполняют, и будет очень плохо, если у них будут как-то меняться приоритеты.
Подскажите, пожалуйста, как можно реализовать подобную функциональность?