为什么 std::mutex::unlock() 不是 noexcept
Why is std::mutex::unlock() not noexcept
为什么 std::mutex::unlock()
不是 noexept
?出于某种原因,当不拥有互斥量的线程对其调用 unlock()
时,标准未定义行为。这样做的理由是什么?如果函数抛出,这不会导致 std::unique_lock
或 std::lock_guard
析构函数实现意外泄漏其析构函数中的异常吗?
注意 抛出 - https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/
的析构函数
std::unique_lock
有一个标志来指示它是否 'owns' 锁。成功调用 lock
后,它会设置标志。当您调用 unlock
时,标志将被重置。
调用析构函数时,如果不拥有锁,则不会调用unlock
。
我不能说为什么委员会没有做到 noexcept
。我只能指出这样一个事实,即 noexcept
通常只明确应用于整个标准库中的几个关键函数,这些函数是实现提供强大异常保证的高效函数所必需的(如 std::swap
或移动构造函数)。
但就 std::unique_lock
而言:它的析构函数是(隐含地)noexcept
,因此如果实现允许 unlock 抛出,unique_lock
的析构函数必须在内部捕获它。
为什么 std::mutex::unlock()
不是 noexept
?出于某种原因,当不拥有互斥量的线程对其调用 unlock()
时,标准未定义行为。这样做的理由是什么?如果函数抛出,这不会导致 std::unique_lock
或 std::lock_guard
析构函数实现意外泄漏其析构函数中的异常吗?
注意 抛出 - https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/
的析构函数std::unique_lock
有一个标志来指示它是否 'owns' 锁。成功调用 lock
后,它会设置标志。当您调用 unlock
时,标志将被重置。
调用析构函数时,如果不拥有锁,则不会调用unlock
。
我不能说为什么委员会没有做到 noexcept
。我只能指出这样一个事实,即 noexcept
通常只明确应用于整个标准库中的几个关键函数,这些函数是实现提供强大异常保证的高效函数所必需的(如 std::swap
或移动构造函数)。
但就 std::unique_lock
而言:它的析构函数是(隐含地)noexcept
,因此如果实现允许 unlock 抛出,unique_lock
的析构函数必须在内部捕获它。