如何处理析构函数中互斥对象销毁失败的问题

How to deal with failure to destroy mutex in destructor

本文关键字:对象 失败 问题 何处理 处理 析构函数      更新时间:2023-10-16

假设在一个互斥类中有以下析构函数来封装pthread互斥调用:

~mutex()
{
    pthread_mutex_destroy(&m_mutex);
}

如果失败(返回非零),我们显然不能抛出异常。我们如何最好地处理这个问题?

编写一条错误消息并调用abort()。当不可能的事情似乎已经发生时,硬的、可见的失败往往比继续愉快要好。

我认为除了忽略它(可能会记录一条消息,尤其是当你得到EBUSY时,因为这可能表明你的程序中存在严重的逻辑错误)之外,你没有什么可做的。

您可以看看boost::threads:如果您正在构建版本-返回代码将不会被检查,如果您正在生成调试版本-abort()将被调用并打印错误消息,boost_VERIFY是此的用户

在我看来,在这种情况下,唯一合理的追索权是assert(3)——出了严重的问题,所以必须有人调查。。。

我建议使用运行时断言。如果它失败了,你就陷入了posix行为不明确的境地。

它在析构函数内部这一事实无关紧要。问题是,如果销毁失败,您将无法恢复(忽略它除外)。无论你使用什么语言,情况总是如此。