Как разблокировать boost :: upgrade_to_unique_lock (сделано из boost :: shared_mutex)? - PullRequest
3 голосов
/ 09 октября 2011

Итак, у меня был какой-то shared_mutex и я сделал это:

        boost::upgrade_lock<boost::shared_mutex> lock(f->mutex);
        boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);

Теперь я хочу "разблокировать его" или, по крайней мере, понизить его до что-то вроде:

boost::shared_lock<boost::shared_mutex> lock_r(f->mutex);

Как это сделать? Возможно ли это?

1 Ответ

9 голосов
/ 09 октября 2011

Если вы позволите 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.

...