Если вы позволите upgrade_to_unique_lock
выйти из области видимости, он будет автоматически понижен до уровня владения.
Например
void foo() {
boost::upgrade_lock<boost::shared_mutex> lock(f->mutex);
// Do shared operations, as mutex is held upgradeable
// ...
if(need_to_get_unique)
{
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
// Do exclusive operations, as mutex is held uniquely
// ...
// At end of scope unique is released back to upgradeable
}
// Only shared operations here, as it's only held upgradeable
// ...
// At end of scope mutex is completely released
}
Редактировать: еще одна вещь.Если для данной функции требуются только эксклюзивные блокировки, вы можете использовать boost::unique_lock
и выполнять уникальную блокировку, не проходя ни блокировки upgrade
, ни upgrade_to_unique
.