Как сделать мьютекс с приоритетами или RW-lock с эксклюзивным чтением

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
Pitisushero
Сообщения: 2
Зарегистрирован: 18 ноя 2013, 18:32

29 сен 2014, 03:19

Доброго времени суток!

Есть некоторая структура данных, к которой обращается малое число поставщиков данных и в несколько раз больше число потребителей. И поставщик данных и потребитель требуют эксклюзивной блокировки для своей работы, но, если использовать обычный mutex, то в результате получается перекос в сторону потребителей и поставщики данных начинают терять производительность.

Фактически, необходимо три уровня приоритетов:shared - read-only операции, которые могут выполняться реально одновременно не мешая друг другу;consume-exclusive - низкопроиоритетные операции, требующие эксклюзивной блокировки;produce-exclusive - высокоприоритетные операции, требующие эксклюзивной блокировки.
В принципе, shared можно даже не выделять, а использовать consume-exclusive уровень для этих задач, так как они очень маленькие по ресурсоемкости (много меньше, чем другие операции).

Первой мыслью было взять boost::shared_mutex и внутри shared-блокировки использовать обычный mutex для разделения читателей, но тогда получится, что если на это мутексе заблокируется читатель, и в этот момент придет писатель и начнет ждать уникальную блокировку, то вначале все равно отработает читатель и только после того, как он освободит shared-блокировку писатель сможет приступить к работе.

Как либо менять приоритеты потоков или воздействовать на планировщик ОС нельзя, так как эти потоки еще много другой работы выполняют и будет очень плохо, если у них будут как-то меняться приоритеты.

Подскажите, пожалуйста, как можно реализовать подобную функциональность?
Ответить