Как получить эксклюзивную блокировку * сначала *, а затем перейти к общему доступу без снятия блокировки

Переполнение стека имеет несколько Примеры где функция получает с возможностью расширения замок первый а также затем получает эксклюзивный доступ путем обновления. Я понимаю, что это Можно вызвать взаимоблокировки, если не использовать их осторожно, поскольку два потока могут оба получить обновляемую / общую блокировку, а затем обе пытаются обновить, и в этот момент ни один из них не может продолжить работу, так как другой имеет общую блокировку.

Я хочу сначала получить эксклюзивную блокировку, а затем перейти к общей блокировке, не снимая ее полностью. Я не могу найти пример этого. Есть идеи?

5

Решение

Boost предлагает эту функцию через UpgradeLockable концепция. Метод, который вы ищете unlock_and_lock_shared().

Реализация этой концепции обеспечивается upgrade_mutex учебный класс.

4

Другие решения

Кажется, правильный способ сделать это с помощью блокировочных адаптеров должен быть примерно таким:

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_lockRV ссылается на shared_lock который вызывает unlock_and_lock_shared( ), Увидеть эта ветка электронной почты а также источник.

0