Наличие нескольких блокировок считывателя в одном потоке
У меня есть данные в сочетании с Lock = boost::shared_mutex
, Я блокирую доступ к данным с помощью
блокировка считывателя ReadLock = boost::shared_lock<Lock>
и писатель замки WriteLock = boost::unique_lock<Lock>
,
Очевидно, что многие читатели могут читать данные одновременно, и только один пишет на них. Но вот подвох:
Один поток может иметь многократные блокировки на один и тот же мьютекс, потому что он вызывает функции, которые сами блокируют данные (с помощью ReadLock
). Но, как я обнаружил, это вызывает блокировку:
- Поток 1 считывает данные блокировки (Lock1)
- Поток 2 ждет с блокировкой записи (LockW)
- Поток 1 порождает другую блокировку чтения (Lock2), пока Lock1 еще жив
Теперь я получаю блокировку, потому что Lock2
ждет LockW
выходить, LockW
ждет Lock1
, а такжеLock1
застрял из-за Lock2
,
Я не знаю, возможно ли изменить дизайн так, чтобы каждый поток делал только один ReadLock
, Я верю, что наличие системы, которая заставляет писателей голодать, решит мои проблемы. Есть ли общий способ обработки моего дела?