Comment débloquer boost :: upgrade_to_unique_lock (fabriqué à partir de boost :: shared_mutex)?

Donc, j’ai eu shared_mutex et fait ceci:

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

maintenant je veux “le déverrouiller” ou du moins le rétrograder à quelque chose comme:

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

Comment faire une telle chose? C’est possible?

Si vous laissez le upgrade_to_unique_lock sortir du cadre, il sera automatiquement rétrogradé pour mettre à niveau la propriété.

Par exemple

 void foo() { boost::upgrade_lock lock(f->mutex); // Do shared operations, as mutex is held upgradeable // ... if(need_to_get_unique) { boost::upgrade_to_unique_lock 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 } 

Edit: Une autre chose. Si une fonction donnée ne nécessite que des verrous exclusifs, vous pouvez utiliser boost::unique_lock et verrouiller de manière unique, sans passer par les verrous upgrade et upgrade_to_unique .