boost scoped_lock vs普通锁定/解锁

时间:2013-03-02 21:18:39

标签: c++ boost thread-safety mutex

我将使用boost::mutex中的boost/thread/mutex.hpp。 锁定/解锁互斥锁的方法有多种:scoped_lockunique_locklock_guard,互斥锁的成员函数::lock()::unlock()以及非成员函数{{1} }和lock()

我注意到,unlock()是使用互斥锁的最常用方法之一。为什么它更适合成员函数boost::scoped_mutex::lock()

特别是,我为什么要使用

::unlock()

而不是

{
  boost::scoped_lock lock(mutex)
  // ...
  // read/output sharing memory.
  // ...
}

仅仅因为某些样式编码的观点而更好mutex.lock() // ... // read/output sharing memory. // ... mutex.unlock() ,或者scoped_lock不是“线程足够安全”吗?

2 个答案:

答案 0 :(得分:65)

  

为什么它更适合成员函数:: lock()和:: unlock()?

出于同样的原因,为什么RAII idiom在一般情况下变得流行(这只是其无数个例子中的一个):因为你可以确定你不会在没有解锁互斥锁的情况下离开当前范围。

请注意,这不仅仅是忘记来致电unlock():您的互斥锁被锁定时可能会发生异常,并且可能永远无法拨打您unlock()的电话即使您在致电return和致电lock()之间没有任何unlock()声明,也可以。

m.lock() // m is a mutex
// ...
foo(); // If this throws, your mutex won't get unlocked
// ...
m.unlock()

在这种情况下,将在堆栈展开期间调用scoped_lock防护的析构函数,确保相关的互斥锁总是被释放。

{
    boost::scoped_lock lock(m); // m is a mutex
    // ...
    foo(); // If this throws, your RAII wrapper will unlock the mutex
    // ...
}

此外,在许多情况下,这会提高代码的可读性,因为您不必在每个unlock()语句之前添加对return的调用。

答案 1 :(得分:2)

你可以使用

std::lock_guard<std::mutex> lock(mutex);

如果不想使用boost库。