gpt4 book ai didi

c++ - 哪种代码被认为是异常安全的?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:28 24 4
gpt4 key购买 nike

能够很好地处理异常的代码称为异常安全代码?这是正确的吗?

来自这里:https://codereview.stackexchange.com/a/9759/11619

You use lock/unlock pairs for the mutex. This is not exception safe. So I would create an object that will do the lock in the constructor and unlock in the destructor then use this to lock your mutexs. This will make your code more exception safe.

class MutexLocker
{
pthread_mutex_t& mutex;
MutextLocker(pthread_mutex_t& mutex)
: mutex(mutex)
{
pthread_mutex_lock(&mutex);
}
~MutexLocker()
{
pthread_mutex_unlock(&mutex);
}
};

上面显示的代码异常在哪些方面是安全的?我在那里没有看到任何异常处理。

或者异常安全代码意味着我们可以在哪里“添加”异常处理?那么,上面显示的代码可以通过添加异常处理来实现异常安全,但现在不是吗?

最佳答案

异常安全不是关于处理异常,而是关于即使在存在异常的情况下也能保证程序的一些属性。

您通常可以谈论 exception safety level给定方法的:

  • 不保证:此方法异常不安全,即根本不提供任何保证。
  • 基本异常保证:在发生异常的情况下,没有资源泄漏并且所涉及的类仍然可用(但它们的状态未指定),即没有内存泄漏,没有文件句柄泄漏,没有互斥锁泄漏和所涉及实例的不变量仍在验证中。
  • 强异常保证:在异常情况下,所有状态都将恢复到开始之前的状态。这是一个类似语义的事务。
  • NoThrow Guarantee:此方法不抛出,它总是成功。

一般来说,NoThrow 保证 只适用于最简单的方法(例如 vector 上的 .size())和强异常保证的实现成本可能很高(能够恢复效果或对状态拷贝进行操作可能并不便宜)。

另一方面,基本异常保证就是:基本。没有它,安全地运行程序是不可能的,所以这是可接受的最低保证。如果泄漏资源或使类处于不可用状态,程序可能无法进一步运行。

这就是为什么每当提到异常时都会如此强调 RAII。因为 RAII 保证自动清理资源(内存、互斥量、文件),无论执行路径如何(常规返回或异常),所以特别可取。然而,RAII 本身是不够的。

相关:Herb Sutter 关于 Exception Safety and Exception Specifications 的 GotW 条目.

关于c++ - 哪种代码被认为是异常安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9665433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com