为什么std::mutex::unlock()
不是noexept
?由于某种原因,当不具有互斥锁的线程在其上调用unlock()
时,标准将行为保留为未定义。这样做的理由是什么?如果函数抛出,这不会导致std::unique_lock
或std::lock_guard
析构函数实现在析构函数中意外泄漏异常吗?
注意投掷的析构函数 - https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/
答案 0 :(得分:2)
我不能说为什么委员会没有成功noexcept
。我只能指出noexcept
一般来说 - 只是明确地应用于整个标准库中的几个关键函数,这些函数是实现提供强大异常保证的有效函数所必需的(如std::swap
或移动构造函数)。
就std::unique_lock
而言:它的析构函数是IS(隐式)noexcept
,所以如果一个实现允许解锁抛出,unique_lock
的析构函数会有在内部抓住它。
答案 1 :(得分:0)
std::unique_lock
有一个标记,表明它是否拥有'锁。成功调用lock
后,它会设置标志。当您拨打unlock
时,该标志将被重置。
当析构函数被调用时,如果它没有锁定,它就不会调用unlock
。