如何处理析构函数中互斥对象销毁失败的问题
How to deal with failure to destroy mutex in destructor
假设在一个互斥类中有以下析构函数来封装pthread互斥调用:
~mutex()
{
pthread_mutex_destroy(&m_mutex);
}
如果失败(返回非零),我们显然不能抛出异常。我们如何最好地处理这个问题?
编写一条错误消息并调用abort()。当不可能的事情似乎已经发生时,硬的、可见的失败往往比继续愉快要好。
我认为除了忽略它(可能会记录一条消息,尤其是当你得到EBUSY
时,因为这可能表明你的程序中存在严重的逻辑错误)之外,你没有什么可做的。
您可以看看boost::threads:如果您正在构建版本-返回代码将不会被检查,如果您正在生成调试版本-abort()将被调用并打印错误消息,boost_VERIFY是此的用户
在我看来,在这种情况下,唯一合理的追索权是assert(3)
——出了严重的问题,所以必须有人调查。。。
我建议使用运行时断言。如果它失败了,你就陷入了posix行为不明确的境地。
它在析构函数内部这一事实无关紧要。问题是,如果销毁失败,您将无法恢复(忽略它除外)。无论你使用什么语言,情况总是如此。
相关文章:
- 自定义对象的dlib序列化在gcc中失败
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- std::list::merge() 对于包含对象的列表失败
- 断言"IsObject()"在通过 Boost ASIO 发送对象时失败
- 使用方法失败更改constexpr对象成员
- C 如何停止对象构建失败的执行
- 使用GDI+删除位图和CLSID对象时,C++内存管理失败
- 为什么在 std::transform 中使用函数对象参数失败并且需要 lambda 表达式
- C++中的即时对象初始化失败,出现LNK2005错误
- 为什么为我的对象类编译标准优先级队列失败
- C++动态转换失败/子对象被视为父对象
- 创建对象时调试断言失败
- C++全局对象初始化失败——为什么?以及是否可以将对象放入.DATA部分
- 对象的c++数组,初始化失败
- 如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
- std::vector 在代码拆分后引用要推送的对象失败
- 删除 [] 在 Linux 中放置新对象失败
- 由于未知原因,在void函数中创建(大)对象失败
- 四叉树更新对象失败
- 为什么打印对象失败并显示"no match for 'operator<<'"错误?