我目前使用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
答案 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的生存范围,从而限制了它的解锁时间。如果没有内括号,它将在函数退出时解锁;与它们一起,当它离开内部块时。但是,因为在你的例子中,在离开块和离开函数之间没有任何反应,它们是相同的。