Я думаю, вы просите общий мьютекс.Общий мьютекс (или мьютекс чтения-записи) позволяет многим потокам параллельно блокировать объект, одновременно позволяя одному потоку одновременно блокировать его исключительно.
Проще говоря, если поток запрашивает общий доступ, этопредоставляется, если поток не содержит объект исключительно.Потоку предоставляется эксклюзивность, когда объект не удерживается (совместно используется или эксклюзивно) каким-либо другим потоком.
Обычно используется эксклюзивность чтения и записи.Смотрите общий доступ для чтения и эксклюзивный доступ для записи.Это верно, потому что гонка данных может происходить только тогда, когда два или более потоков обращаются к одним и тем же данным, и по крайней мере один из них является операцией записи.Множество считывателей - это не гонка данных.
Обычно при реализации общей блокировки возникают издержки, а не монопольная блокировка, и модель обычно помогает только тогда, когда есть «много» читателей, которые «читают» часто и пишутоперации «редки».Что означает «многие», «частые» и «нечастые», зависит от платформы и проблемы в руках.
Это именно то, для чего предназначен общий мьютекс.C ++ 17 поддерживает это из коробки с помощью std::shared_mutex
, но я заметил, что вопрос помечен C ++ 11.
Некоторые реализации предлагали это в течение некоторого времени (это классическая стратегия блокировки) Или вы можетеtry boost::shared_mutex<>
.
NB. Одна из проблем в общей блокировке состоит в том, чтобы избежать live-lock на устройстве записи.Если есть много читателей, которые часто читают, то может быть легко, чтобы писатель был «заблокирован» на неопределенный срок и никогда не прогрессировал (или прогрессировал очень медленно).Хорошая общая блокировка обеспечит некоторую гарантию того, что автор в конечном итоге получит свою очередь.Это может быть абсолютным приоритетом (авторам не разрешается запускаться после того, как поток начинает ждать