如何处理pthread_mutex_destroy的错误条件

时间:2013-12-10 06:35:00

标签: c unix pthreads mutex

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

如果pthread_mutex_destroy失败,我正在执行断言。但与断言相比,我们有更好的选择(除了提出异常)吗?

编辑:

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;

1 个答案:

答案 0 :(得分:4)

根据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失败时再试一次。但是你确实有三个函数可以在一个函数中失败,因此在这种情况下,将函数分解为不同的部分可能更明智。

修改的 我上面所说的可以帮助你解决一个问题。但经过对此问题的一些评论后,不仅仅是满足了眼球。看来你正在将Pthreads API与C ++风格的互斥系统混合在一起。因为你正在混合他们你会遇到麻烦。坚持使用C ++互斥/线程API或pthread api,可能你的C ++ API是pthread API的包装器,因此你会得到非常奇怪的结果。