c++ - scoped_lock() - 使用 pthread 的 RAII 实现

标签 c++ error-handling pthreads c++03 raii

我有一个在 4 个线程之间共享的套接字,我想使用 RAII 原理来获取和释放互斥锁。


实际情况

  1. 我正在使用 pthread 库。
  2. 我无法使用 Boost。
  3. 我无法使用比 C++03 更新的任何内容。
  4. 我无法使用异常。

背景

我认为我可以编写一个 scoped_lock() 来锁定互斥体,而不是每次使用之前都必须锁定套接字的互斥体,然后立即解锁互斥体它超出范围,它会自动解锁互斥锁。

因此,很简单,我在构造函数中进行锁定,并在析构函数中进行解锁,如此处所示。

ScopedLock::ScopedLock(pthread_mutex_t& mutex, int& errorCode)
: m_Mutex(mutex)
{
    errorCode = m_lock();
}

ScopedLock::~ScopedLock()
{
    errorCode = m_unlock();
}

其中 m_lock()m_unlock() 是围绕 pthread_mutex_lock()pthread_mutex_unlock( ) 分别具有一些额外的跟踪线/日志记录功能。

这样,我就不必编写至少两个解锁语句,一个用于好的情况,一个用于坏的情况(至少一个,在某些情况下可能是更多的坏路径)。


问题

我遇到的问题以及我不喜欢这个方案的地方是析构函数。

我已经认真地为每个函数完成了错误处理,但是从这个 ScopedLock() 的析构函数中,我无法通知调用者任何可能返回我的 m_unlock( )

最佳答案

这是 RAII 的一个根本问题,但在这种情况下,你很幸运。 pthread_unlock 仅在您设置互斥体错误 (EINVAL) 或尝试从不拥有该互斥体的线程中解锁错误检查互斥体 (EPERM)。这些错误表明代码中存在错误,而不是您应该考虑的运行时错误。在这种情况下,asserting errorCode==0 是一个合理的策略。

关于c++ - scoped_lock() - 使用 pthread 的 RAII 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53485253/

相关文章:

即使类没有定义构造函数,也不能在类上调用 C++ 默认移动赋值运算符

c++ - 构造函数异常和动态分配

c++ - 获取模板错误

c - 如何使用指针将从 Pthread 返回的多个数组存储在另一个数组中

c - 多线程程序额外运行while循环次数

c++ - 崇高文本 : compiler build options

php - 要显示的Laravel API验证错误

go - Golang 中处理 nil 和 error 的惯用方法是什么?

php - 未捕获异常

c - 来自信号处理程序的 pthread_join