我将使用boost::mutex
中的boost/thread/mutex.hpp
。
锁定/解锁互斥锁有几种方法:使用scoped_lock
,unique_lock
,lock_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()
不够“线程安全”吗? 最佳答案
出于同样的原因,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
// ...
}
此外,在许多情况下,这将 boost 代码的可读性,因为您不必在每个
unlock()
语句之前添加对return
的调用。