Кажется, что Boost shared_mutex не рекурсивный. Есть ли вообще вокруг этого? (без повторного внедрения всего материала)
BOOST: рекурсивный shared_mutex?
Ответ 1
посмотрите этот поток и отличное объяснение, почему shared_mutex
Плохая идея вообще. поэтому, если вы не согласны с тем, что recursive_mutex
- плохая идея, просто используйте ее без какой-либо шарнира, потому что она не может дать вам никакого повышения производительности. вы получите даже более чистый код без каких-либо серьезных изменений.
Я попытался использовать shared_mutex в своем проекте, чтобы заблокировать сильно оспариваемую карту, когда многие потоки часто читают данные и редко меняют ее. получили немного худшие результаты работы
Ответ 2
Я частично не согласен с Энди в том, что shared_mutex - плохая идея, потому что это зависит от вашего дизайна, то есть как вы используете его в своей программе. Я считаю, что если вы часто часто читаете с использованием общих мьютексов, это может принести вам более эффективную производительность, чем если бы вы использовали простой мьютекс для более коротких более частых блокировок для чтения с помощью редких записей. Таким образом, shared_mutex - это способ сделать что-то длительное одновременно. И я не думаю, что длинный замок плохой дизайн в этом случае.
Вы поддерживаете меня или я ошибаюсь?
Ответ 3
boost:: рекурсивный мьютекс является исключительным. Я думаю, вам нужно расширить shared_mutex. Вы можете сохранить текущий идентификатор потока в наборе и проверить, существует ли он в наборе в функции, обеспечивающей блокировку.
Ответ 4
Я уже шел по этой дороге лично. Простой ответ: нет, нет shared_recursive_mutex.
Я не согласен с тем, что другие расскажут вам о том, как рекурсивные мьютексы, как правило, плохая идея, это, безусловно, может сэкономить время и предотвратить некоторые ошибки. Однако, если вы не хотите реализовывать свой собственный shared_recursive_mutex, вам придется придерживаться нерекурсивных мьютексов. Это не так уж плохо.
Ответ 5
В этих случаях вам придется использовать shared_ptr. Поместите мьютекс в shared_ptr, и он будет делать ref-counting на вашем мьютексе, что даст вам близкие результаты.