首页 > 解决方案 > 互斥体有范围吗?

问题描述

std::mutex有范围吗?我知道在 JAVA 中我们可以使用{}限制范围内的锁来尽快释放锁。如果我们可以在 c++ 中做同样的事情?

void func() {
  // some code
  {
    std::lock_guard<std::mutex> lock(mutex_);
  }
  // some code
}

另外,互斥锁何时起作用?锁是一进入函数就起作用,还是一直执行到当前行被锁定?编译器对代码优化有影响吗?

void func() {
  // some code
  std::lock_guard<std::mutex> lock(mutex_);   // mutex work here or as soon as it enters the function
  // some code
}

标签: c++mutex

解决方案


在帮助下,我终于找到了答案。阅读源代码,然后没有魔法。下面是 lock_guard 的源代码。

   template<typename _Mutex>
     class lock_guard
     {
     public:
       typedef _Mutex mutex_type;
 
       explicit lock_guard(mutex_type& __m) : _M_device(__m)
       { _M_device.lock(); }
 
       lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m)
       { } // calling thread owns mutex
 
       ~lock_guard()
       { _M_device.unlock(); }
 
       lock_guard(const lock_guard&) = delete;
       lock_guard& operator=(const lock_guard&) = delete;
 
     private:
       mutex_type&  _M_device;
     };

“lock_guard”在创建时获取锁,在销毁时释放锁。它帮助我们不要忘记释放锁。
即使程序失败,也会调用析构函数来释放锁。


推荐阅读