c++ - 如何解锁 boost::upgrade_to_unique_lock(由 boost::shared_mutex 制成)?

标签 c++ multithreading boost locking mutex

所以我有一些 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);

如何做这样的事情?可能吗?

最佳答案

如果您让 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 并进行唯一锁定,而无需同时使用 upgradeupgrade_to_unique 锁.

关于c++ - 如何解锁 boost::upgrade_to_unique_lock(由 boost::shared_mutex 制成)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7704870/

相关文章:

c++ - 出现错误 C2177 : constant too big with MPIR

C++ 从下往上读取文件

java - 在 Java 中启动线程而不等待它们(使用 .join())是危险的吗?

Java:线程等待对象时是否释放所有监视器?

C++ Map基于变量键返回类对象

c++ - 企业架构师(C++): Import Source Code with Custom Macro and Argument in Parantheses

java - 如何在 Java 中使用线程池并重新加入线程?

c++ - 将窄 (char) 输入流重新解释为宽 (wchar_t) 流

c++ - 从不同线程写入 boost::asio 套接字

c++ - OPERATOR_BRACKET_IS_NOT_SUPPORTED 在 boost::bimap 上