【发布时间】: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 调用中添加错误检查和日志记录。这至少可以揭示正在发生的事情,您确实不需要需要在黑暗中挖掘,猜测可能发生了什么......