Переполнение стека имеет несколько Примеры где функция получает с возможностью расширения замок первый а также затем получает эксклюзивный доступ путем обновления. Я понимаю, что это Можно вызвать взаимоблокировки, если не использовать их осторожно, поскольку два потока могут оба получить обновляемую / общую блокировку, а затем обе пытаются обновить, и в этот момент ни один из них не может продолжить работу, так как другой имеет общую блокировку.
Я хочу сначала получить эксклюзивную блокировку, а затем перейти к общей блокировке, не снимая ее полностью. Я не могу найти пример этого. Есть идеи?
Boost предлагает эту функцию через UpgradeLockable концепция. Метод, который вы ищете unlock_and_lock_shared()
.
Реализация этой концепции обеспечивается upgrade_mutex
учебный класс.
Кажется, правильный способ сделать это с помощью блокировочных адаптеров должен быть примерно таким:
boost::shared_mutex mtx;
void exclusive_to_shared( )
{
boost::unique_lock< boost::shared_mutex > unique_lock( mtx );
// The lock here is exclusive.
boost::shared_lock< boost::shared_mutex > shared_lock( std::move( unique_lock ) );
// The lock here is shared.
}
Там явное преобразование, определенное из unique_lock
RV ссылается на shared_lock
который вызывает unlock_and_lock_shared( )
, Увидеть эта ветка электронной почты а также источник.