Подтвердить что ты не робот

BOOST: рекурсивный shared_mutex?

Кажется, что Boost shared_mutex не рекурсивный. Есть ли вообще вокруг этого? (без повторного внедрения всего материала)

4b9b3361

Ответ 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 на вашем мьютексе, что даст вам близкие результаты.