如何正确处理pthread互斥锁

How to properly dispose of a pthread mutex?

本文关键字:pthread 正确处理      更新时间:2023-10-16

我写了一个类来包装互斥锁。在析构函数中,我调用pthread_mutex_destroy,有时它返回EBUSY,因为其他线程没有释放它。我的问题是,处理互斥锁销毁的最好方法是什么?我应该等它免费吗?

这是我到目前为止得到的,可能不是最好的解决方案:

Mutex::~Mutex()
{
    int rc = pthread_mutex_destroy( &_mutex );
    while ( rc == EBUSY )
    {
        lock(); // Call to pthread_mutex_lock
        unlock(); // Call to pthread_mutex_unlock
        // Attempt destroy again
        rc = pthread_mutex_destroy( &_mutex );
    }
}

我的问题是,什么是最好的方法来处理互斥锁的销毁?我应该等它免费吗?

你不应该破坏正在使用的资源,因为这通常会导致未定义的行为。

正确的做法是:

  • 告诉其他线程释放资源并等待,或者
  • 告诉另一个线程礼貌地终止并等待,直到它完成,或者
  • 将资源的所有权传递给另一个线程,并让它按照自己的意愿管理资源的生命周期,或者
  • 使用共享的资源,这样当它的用户还在的时候,它们仍然是活的。