【发布时间】:2016-07-09 15:49:51
【问题描述】:
我正在开发一个也可以处理错误的线程安全类。我想知道如何处理来自函数 pthread_mutex_unlock() 的可能错误。如果我抛出互斥体仍然被锁定?我应该尝试再次解锁还是销毁类对象?
int SomeClass::function() {
int res = pthread_mutex_lock(&_mutex);
if(res < 0)
throw std::runtime_error("lock failed: " + std::string(std::strerror(res)));
// some code
res = pthread_mutex_unlock(&_mutex);
if(res < 0)
throw std::runtime_error("unlock failed: " + std::string(std::strerror(res)));
return something;
}
谢谢!
编辑:
变量_mutex 是一个受保护的类成员(非静态),仅使用pthread_mutex_init(&_mutex, NULL) 在构造函数内部初始化
【问题讨论】:
-
它是什么类型的互斥锁?我认为它属于
SomeClass并且不是全球性的。它是否在SomeClass的多个实例之间共享?这些问题的答案将揭示:A) 可能会发生什么错误,以及 B) 破坏对象的风险是什么。你考虑过pthread_mutex_trylock()吗? -
见编辑部分。我认为如果我使用
pthread_mutex_trylock(),我也必须使用pthread_mutex_unlock(),所以不知道这有什么帮助。 -
我相信 unlock() 的唯一错误是当你没有锁时调用它。这将是您的代码中的逻辑错误。所以记录并抛出。提示:如果您的编译器支持它...将 __FILE__ 或 __FILENAME__ 或“编译单元名称的编译器相关方法”添加到您的异常消息中。如果你是一个优秀的人,也可以寻找行号机制。
-
我没有正确阅读您的标题。删除了之前的评论。您正在询问如何从 unlock() 失败中恢复。看上面。解锁失败是逻辑错误(或互斥体损坏)。
-
关于 lock() 失败:我不会在你的方法中重试。返回“忙”或“不是现在”错误并允许调用者重试。为什么?在重试机制期间你没有工作要做,调用者可以。
标签: c++ error-handling pthreads