繁体   English   中英

boost scoped_lock vs普通锁定/解锁

[英]boost scoped_lock vs plain lock/unlock

我将使用boost/thread/mutex.hpp boost::mutex 有几种方法可以锁定/解锁互斥锁:使用scoped_lockunique_locklock_guard ,互斥锁的成员函数::lock()::unlock()以及非成员函数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更好只是因为一些样式编码的观点或是::lock()/::unlock()不是“线程足够安全”?

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

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

请注意,这不仅仅是忘记调用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
    // ...
}

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

您可以使用

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

如果不想使用boost库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM