互斥体有作用域吗?

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
}
iCMS 回答:互斥体有作用域吗?

在帮助下,我终于找到了答案。 先阅读源代码,然后变魔术。下面是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”在创建时获取锁,并在销毁时释放锁。 这有助于我们不要忘记释放锁。
即使程序失败,也会调用析构函数来释放锁。

本文链接:https://www.f2er.com/1573670.html

大家都在问