c++ - 是否有任何惯用的显式使用 mutex::lock() 或 unlock()?

标签 c++ multithreading c++11 locking mutex

推荐的使用方式 mutex用于锁定代码的关键区域是通过 RAII,即

mutex_type mutex;
{ // start of critical region
  std::lock_guard<mutex_type> lock(mutex);   // first statement in critical region
  // ... do critical stuff, may throw an exception
} // end of critical region

这样当在临界区内抛出异常时,互斥量仍将被解锁(由 std::lock_guard 的析构函数)。然而,这样的成员mutex::lock()mutex::unlock()永远不会被用户代码显式调用。

Q mutex::lock() 的主要惯用显式用法是什么(如果有的话) ?

我在问,否则 mutex::lock() 就没有意义了宣传错误代码的公共(public)成员(避免 std::lock_guard 的代码)。

编辑 由于两者 std::lock_guard<>std::mutex在同一个标​​题中定义,std::mutex很容易成为 friend std::lock_guard<std::mutex并有它的lock()unlock() protected 方法:

class mutex      // use only with lock_guard<mutex>
{
  friend class lock_guard<mutex>;         // support acquire-release semantic via RAII
  friend class scoped_lock_guard<mutex>;  // for supporting more complicated semantic,
                                          //     possibly remembering the mutex state.
  // ...
protected:
  void lock();
  bool try_lock();
  void unlock();       
};

class raw_mutex  // use if you absolutely must explicitly lock, try_lock, or unlock
: public mutex
{
public:
  using mutex::lock;
  using mutex::try_lock;
  using mutex::unlock;
};

一个论点 回答我的问题很简单,唯一的异常安全方法是使用 mutex::lock()通过 RAII。因此,唯一明智的显式使用必须只涉及 noexcept调用 lock 之间的方法(或 try_lock )和 unlock .然而,由于 noexcept只是暗示性的,没有任何 promise ,这样的使用是不安全的。 正确吗?

最佳答案

lock_guard 并不是唯一需要在 mutex 上调用 lock/unlock 的东西。 unique_locklocktry_lockcondition_variable_any 都必须在互斥体上工作。那只是标准类型。在这种情况下,友元引入了成为障碍的紧密耦合。

关于c++ - 是否有任何惯用的显式使用 mutex::lock() 或 unlock()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873082/

相关文章:

c++ - "Manual"签名重载解析

c++ - 我的 vector<T>::erase 这里有什么问题?

c++ - 使用 C++ 清除屏幕

c++ - 使用 DFS 检测有向图中的循环?

java - 链表数据结构的同步问题?

c++ - c++中基类如何调用派生类传递的闭包?

c++ - Project0_opengl.exe : 0xC0000005: Access violation executing location 0x00000000 中的 0x00000000 抛出异常

c# - 澄清使用匿名方法从单独的线程更新 GUI

multithreading - Thread.Sleep() 和 Thread.SpinWait() 有什么区别

c++ - 大括号或等于初始化程序在 Visual Studio 2015 RC 中导致 C2098 和 C2059