【问题标题】:How to handle error conditions of pthread_mutex_destroy如何处理 pthread_mutex_destroy 的错误情况
【发布时间】:2013-12-10 06:34:59
【问题描述】:

当我尝试通过 pthread_mutex_destroy(&mutex) 销毁互斥锁​​时,它会间歇性地失败。

如果 pthread_mutex_destroy 失败,我正在做一个断言。但是与 assert 相比,我们有更好的选择吗(除了引发异常)?

编辑:

void cleanUp()
{
  int rval=0;
  rval = pthread_cond_destroy(&m_Condition);
  assert(rval == 0);
  rval = pthread_mutex_destroy(&m_Mutex);
  assert(rval == 0);
  rval = pthread_mutexattr_destroy(&m_Attr);
  assert(rval == 0);
}

编辑 2:

void semaphoreVMware::semaphoreVMware()
{
int rval = 0;
rval = pthread_mutexattr_init(&m_Attr);
assert(rval == 0);
rval = pthread_mutexattr_settype(&m_Attr, PTHREAD_MUTEX_RECURSIVE);
assert(rval == 0);
rval = pthread_mutex_init(&m_Mutex, &m_Attr);
assert(rval == 0);
rval = pthread_cond_init(&m_Condition, NULL);
assert(rval == 0);
}

编辑3:互斥体声明:

env::Mutex m_Mutex;

【问题讨论】:

  • 你知道它为什么会失败吗?
  • 你能发布一些示例代码吗?你不能检查返回值并采取行动而不是抛出断言吗?
  • @ServerMonkey 几乎所有来自 pthread_mutex_destroy 的错误都是编程错误,除了资源限制,不应该是间歇性的。最好解决问题,以免发生错误。
  • 您好,感谢您的回复。实际上,每当我们停止服务时,都会调用我发布的清理代码。场景是服务的启动和停止,我们在循环中执行此操作。当我们进行这些迭代,pthread_mutex_destroy() 会间歇性地返回非零值,因此断言命中,然后中止程序和核心转储。这种中止是不规则的。
  • 您应该真的在 pthread 调用中添加错误检查和日志记录。这至少可以揭示正在发生的事情,您确实不需要需要在黑暗中挖掘,猜测可能发生了什么......

标签: c unix pthreads mutex


【解决方案1】:

根据 man pthread_mutex_destroy 只能发生一个错误。也就是说,在销毁时互斥锁仍然被锁定。因此,您可能不会在尝试销毁/释放互斥锁之前解锁它。

来自man 3 pthread_mutex_destroy

   The pthread_mutex_destroy function returns the following error code on error:

          EBUSY  the mutex is currently locked.

如果你销毁互斥锁​​,你应该检查返回值是否为EBUSY(你可能必须#include <errno.h>)。

所以你现在要做的是你有void cleanUp() 你可以让它返回一个int 并在pthread_mutex_destroy 失败时重试。但是,您确实有三个功能可能会在一个功能中失败,因此在这种情况下,将功能分解为不同的部分可能更明智。

编辑 我上面所说的可以帮助您解决您最初提出的问题。但是在这个答案上进行了相当多的 cmets 之后,有更多的东西。看来您正在将 Pthreads API 与 C++ 风格的互斥系统混合使用。因为你正在混合它们,所以你会遇到麻烦。坚持使用 C++ 互斥/线程 API 或 pthread api,可能你的 C++ API 是 pthread API 的包装器,因此你会得到非常奇怪的结果。

【讨论】:

  • 这个问题是多线程开发人员的典型问题。尝试以“干净”的方式关闭复杂的多线程代码时进入。在许多操作系统上,最好不要尝试。
  • @MartinJames 另一个问题是 OP 似乎将互斥锁放在堆栈上,而不是动态分配它们。但他没有显示那部分代码。
  • @MartinJames:除此之外我觉得不进行“干净”关机是个坏建议,我想知道操作系统与此有什么关系?
  • @alk - 对于 posix 可能运行的一些更原始的操作系统,这是一个不好的建议。在其他方面,尝试“干净”关闭的成本,包括时间、CPU 使用、像这样的可避免关闭代码中的错误、关闭代码的额外测试等,都是非常高的。除非您是操作系统,否则复杂的多线程应用程序很难干净地关闭 - 用户代码没有始终可靠地执行此操作的工具。有时,您必须为彻底停工付出高昂的代价,但如果可以避免,我会非常努力地不支付。
  • @Ravikanth 你确定互斥锁实际上是pthread_mutex_t 你似乎在混合 C++ 和 C。因为 C++11 中的 C++ std::Mutex 可能是 phtread_mutex_t 的包装器,所以你是如果你开始混合它们就会有麻烦。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多