【发布时间】:2019-02-11 21:11:56
【问题描述】:
在 Java 中:
Lock lock = new ReentrantLock();
try{
lock.lock();
someFunctionLikelyToCauseAnException();
}
catch(e){...}
finally {
lock.unlock();
}
我的问题是,对于上面这个例子,我们知道锁总是会被解锁,因为 finally 总是会执行,但是 C++ 的保证是什么?
mutex m;
m.lock();
someFunctionLikelyToCauseAnException();
/// ????
这将如何工作以及为什么?
【问题讨论】:
-
使用 std::lock_guard 进行 RAII 方法。
std::lock_guard对象将解锁它在析构函数中的任何互斥锁。 -
你应该阅读stack unwinding,这是c++的一个非常重要的特性。
-
简而言之:c++不需要finally,因为它有析构函数
-
@user4581301 你从哪里读到Java有析构函数?它有终结器。它被称为不同的东西,因为它不是析构函数。问题是终结器通常被称为析构函数,我对此有疑问。
-
锁通常与模式一起使用:“(1)状态一致但错误(2)进入尝试(3)等到你可以拿锁(4)使状态不一致(5 )使状态正确且一致,(6)进入最终(7)释放锁(8)状态现在一致且正确。” 如果在第 4 步之后和第 5 步之前发生 throw 会发生什么? 我们直接进入第 6 步,但状态现在既不一致又错误!然后我们解锁锁,现在等待的代码可以访问不一致的错误状态,然后崩溃。这种在 finally 中解锁的模式是超级危险的。
标签: c++ multithreading operating-system locking