互斥锁有作用域吗?

Does mutex have scope?

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
}

在帮助下,我终于找到了答案。 阅读源码,再无魔力。下面是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"创建时获取锁,销毁时释放锁。 它帮助我们不要忘记释放锁。
即使程序失败,也会调用析构函数释放锁。