正确使用boost Lockguard - 这两个是否相同

时间:2013-06-13 17:05:40

标签: c++ boost locking

我目前使用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

2 个答案:

答案 0 :(得分:2)

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的另一个优点是它是异常安全的。

在你给出的两个例子中,因为在第一个例子中没有其他代码在范围之外,两个例子的功能是相同的。

答案 1 :(得分:1)

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

基本上,花括号限制了lock_guard的生存范围,从而限制了它的解锁时间。如果没有内括号,它将在函数退出时解锁;与它们一起,当它离开内部块时。但是,因为在你的例子中,在离开块和离开函数之间没有任何反应,它们是相同的。