正确使用升力锁护-这两者是一样的吗?

Proper use of boost Lockguard - Are these two same

本文关键字:一样      更新时间:2023-10-16

我目前使用boost lockguard如下,但是我仍然对花括号的使用有点困惑。我想知道这两个是否相同

void ThreadSafeMethod()
{
   {//Begin Lock
      boost::lock_guard<boost::mutex> lock(mutex_lock_symbol);
      ....
      ....
   }//End Lock
}

或者这个方法,它消除了一层花括号。这是正确的,和上面一样吗?

void ThreadSafeMethod()
{//Locks automatically 
      boost::lock_guard<boost::mutex> lock(mutex_lock_symbol);
}//Unlocks

boost::lock_guard结构实现了RAII习惯用法(资源分配是初始化),因此在构造时自动锁定,在销毁时自动解锁。发生这种情况的时间取决于通常的c++规则,即当结构离开创建boost::lock_guard的作用域时。

例如:

void TestFunction( void ) {
     // Do non-blocking operations:
     {
          // Lock the Mutex:
          boost::lock_guard<boost::mutex> lockGuard( mutex_lock_symbol );
          // Do blocking operations
     } // Exit scope the boost::lock_guard was created in and therefore destroy it (thus unlock the mutex)
     // Do more non-blocking operations:
}

这只是帮助您通过创建boost::lock_guard创建的新作用域来控制互斥锁的操作数量。boost::lock_guard的另一个优点是它是异常安全的。

在你给出的两个例子中,因为在第一个例子的作用域之外没有其他代码,所以这两个例子的功能是相同的。

是的,它们是一样的,只要你不在内花括号后面添加任何代码。

基本上,花括号限制了lock_guard存在的范围,从而限制了它何时解锁。如果没有内部大括号,它将在函数退出时解锁;和他们在一起,当它离开内部块。但是,由于在您的示例中,在离开块和离开函数之间没有发生任何事情,因此它们是相同的。