C 如何处理pthread_mutex_destroy的错误情况

C 如何处理pthread_mutex_destroy的错误情况,c,unix,pthreads,mutex,C,Unix,Pthreads,Mutex,当我试图通过pthread_mutex_destroy(&mutex)销毁互斥时,它会间歇性地失败 如果pthread\u mutex\u destroy失败,我将执行断言。但与断言相比,我们是否有更好的选择(除了引发异常) 编辑: 编辑2: void semaphoreVMware::semaphoreVMware() { int rval = 0; rval = pthread_mutexattr_init(&m_Attr); assert(rval == 0); rval = pt

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

如果pthread\u mutex\u destroy失败,我将执行断言。但与断言相比,我们是否有更好的选择(除了引发异常)

编辑:

编辑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;

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

man 3 pthread\u mutex\u destroy

   The pthread_mutex_destroy function returns the following error code on error:

          EBUSY  the mutex is currently locked.
如果销毁互斥锁,则应检查返回值是否为
EBUSY
(可能需要
#包括

因此,您现在要做的是使用
void cleanUp()
可以使其返回
int
,并在
pthread\u mutex\u destroy
失败时重试。但是,有三个函数可能在一个函数中失败,因此在这种情况下,将函数分解为不同的部分可能更明智

编辑
我上面所说的可以帮助你回答你最初提出的问题。但是,在对这个问题进行了相当多的评论之后,我们看到的远远不止这些。看来你正在将pPultAPI与C++风格互斥系统混合。因为你把它们混在一起,你就有麻烦了。坚持C++互斥/线程API或pTrices API,可能你的C++ API是一个围绕pthapi API的包装器,因此你会得到非常奇怪的结果。

根据man pthRead MutExpRead只有一个错误可能发生。也就是说,在销毁时,互斥锁仍处于锁定状态。因此,在尝试销毁/释放互斥锁之前,您可能不会解锁互斥锁

man 3 pthread\u mutex\u destroy

   The pthread_mutex_destroy function returns the following error code on error:

          EBUSY  the mutex is currently locked.
如果销毁互斥锁,则应检查返回值是否为
EBUSY
(可能需要
#包括

因此,您现在要做的是使用
void cleanUp()
可以使其返回
int
,并在
pthread\u mutex\u destroy
失败时重试。但是,有三个函数可能在一个函数中失败,因此在这种情况下,将函数分解为不同的部分可能更明智

编辑

我上面所说的可以帮助你回答你最初提出的问题。但是,在对这个问题进行了相当多的评论之后,我们看到的远远不止这些。看来你正在将pPultAPI与C++风格互斥系统混合。因为你把它们混在一起,你就有麻烦了。坚持C++互斥/线程API或pTrices API,可能你的C++ API是一个围绕pTrpAPI的包装器,因此你会得到非常奇怪的结果。

你知道它为什么失败吗?你能张贴一些示例代码吗?您不能检查返回值并采取操作而不是抛出断言吗?@ServerMonkey几乎所有来自pthread_mutex_destroy的错误都是编程错误,但资源限制除外,它不应该是间歇性的。最好是修复问题,这样错误就不会发生。您好,谢谢您的回复。实际上,每当我们停止服务时,就会调用我发布的清理代码。场景是启动和停止服务,我们在循环中执行此操作。当我们进行这些迭代时,pthread_mutex_destroy()非常间歇性地返回非零值,因此断言命中,然后中止程序和coredumps。这种中止是不规则的。您应该在pthread调用中添加错误检查和日志记录。这至少可以让你了解正在发生的事情,你不需要在黑暗中摸索,猜测可能发生了什么……你知道它为什么会失败吗?你能发布一些示例代码吗?您不能检查返回值并采取操作而不是抛出断言吗?@ServerMonkey几乎所有来自pthread_mutex_destroy的错误都是编程错误,但资源限制除外,它不应该是间歇性的。最好是修复问题,这样错误就不会发生。您好,谢谢您的回复。实际上,每当我们停止服务时,就会调用我发布的清理代码。场景是启动和停止服务,我们在循环中执行此操作。当我们进行这些迭代时,pthread_mutex_destroy()非常间歇性地返回非零值,因此断言命中,然后中止程序和coredumps。这种中止是不规则的。您应该在pthread调用中添加错误检查和日志记录。这至少可以让你了解正在发生的事情,你不需要在黑暗中摸索,猜测可能会发生什么……这是多线程开发人员面临的典型问题。尝试以“干净”的方式关闭复杂的多线程代码时,请进入。在许多操作系统上,最好不要尝试。另一个问题是,OP似乎将互斥体放在堆栈上,而不是动态分配它们。但是他没有显示代码的这一部分。@MartinJames:此外,我觉得不进行“干净”关机是一个坏建议,我想知道操作系统与此有什么关系?@alk-对于posix可能运行的一些更原始的操作系统来说,这是一个坏建议。在另一些情况下,尝试“干净”关机的成本非常高,包括时间、CPU使用、可避免的关机代码中的bug(如此)、额外测试关机代码等。一个复杂的、多线程的应用程序很难干净地关闭,除非你是一个操作系统用户,因为代码没有工具总是可靠地关闭它。有时,你必须支付干净关闭的高成本,但是我尽量不支付它。@拉维卡因斯你确信互斥实际上是一个代码> pthRead?MutExtUT/<代码>,因为C++的STD,你似乎正在混合C++和C.:Mutex在C++ 11中可能是围绕PtRADADMutExt的包装器。如果你开始混用它们,你就有麻烦了。这个问题是多线程开发人员遇到的典型问题。当你试图进入