Bri*_*dia 38 c++ multithreading operating-system locking
在Java中:
Lock lock = new ReentrantLock();
try{
lock.lock();
someFunctionLikelyToCauseAnException();
}
catch(e){...}
finally {
lock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是上面这个例子我们知道锁总是会被解锁,因为最终总是执行,但是C++的保证是什么?
mutex m;
m.lock();
someFunctionLikelyToCauseAnException();
/// ????
Run Code Online (Sandbox Code Playgroud)
这将如何工作?为什么?
Nat*_*ica 61
为此,我们使用RAII风格的结构std::lock_guard
.当你使用
std::mutex m;
{ // start of some scope
std::lock_guard lg(m);
// stuff
} // end of scope
Run Code Online (Sandbox Code Playgroud)
lg
将确保m
无论在什么路径下保留将被解锁,因为它在范围出口处被销毁并且std::lock_guard
析构函数将调用unlock
即使抛出异常,堆栈也会被展开(堆栈展开),并且该进程会破坏lg
哪个进程会调用unlock
保证锁被释放.
Rei*_*ica 29
C++的保证是什么?
与您在Java中提到的相比,C++中的相关保证的工作方式略有不同.代替的最后块,它依靠销毁自动变量对本发明范围的退出发生这种情况,因为堆栈帧被展开.无论退出范围如何,无论是优雅还是由于异常,都会发生此堆栈展开.
关于这种锁的场景的优选方法是使用RAII,例如通过实现std::lock_guard
.它拥有一个mutex
传递给其构造的对象-这里面它调用mutex
的lock()
方法,在此之后,线程拥有互斥体-并在栈展开的范围的退出它的析构函数被调用-这里面它调用mutex
"小号unlock()
方法,从而释放它.
代码如下所示:
std::mutex m;
{
std::lock_guard lock(m);
// Everything here is mutex-protected.
}
// Here you are guaranteed the std::mutex is released.
Run Code Online (Sandbox Code Playgroud)