【问题标题】:How to handle a pthread_mutex_unlock() error?如何处理 pthread_mutex_unlock() 错误?
【发布时间】: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(&amp;_mutex, NULL) 在构造函数内部初始化

【问题讨论】:

  • 它是什么类型的互斥锁?我认为它属于SomeClass 并且不是全球性的。它是否在SomeClass 的多个实例之间共享?这些问题的答案将揭示:A) 可能会发生什么错误,以及 B) 破坏对象的风险是什么。你考虑过pthread_mutex_trylock()吗?
  • 见编辑部分。我认为如果我使用pthread_mutex_trylock(),我也必须使用pthread_mutex_unlock(),所以不知道这有什么帮助。
  • 我相信 unlock() 的唯一错误是当你没有锁时调用它。这将是您的代码中的逻辑错误。所以记录并抛出。提示:如果您的编译器支持它...将 __FILE__ 或 __FILENAME__ 或“编译单元名称的编译器相关方法”添加到您的异常消息中。如果你是一个优秀的人,也可以寻找行号机制。
  • 我没有正确阅读您的标题。删除了之前的评论。您正在询问如何从 unlock() 失败中恢复。看上面。解锁失败是逻辑错误(或互斥体损坏)。
  • 关于 lock() 失败:我不会在你的方法中重试。返回“忙”或“不是现在”错误并允许调用者重试。为什么?在重试机制期间你没有工作要做,调用者可以。

标签: c++ error-handling pthreads


【解决方案1】:

pthread_mutex_unlock 肯定会失败的唯一情况是被解锁的互斥锁不是有效的互斥锁或互斥锁不属于您的线程。因此,如果两者都不是,您不必担心,并且这两种情况都是应用程序错误 - 此时您可以抛出异常而不必担心互斥体状态,您有更大的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多