【问题标题】:how to check whether pthread_mutex_t is locked or not如何检查 pthread_mutex_t 是否被锁定
【发布时间】:2013-01-11 06:35:50
【问题描述】:

我很确定这是一个幼稚的问题,但仍然会问它,因为我在网上找不到太多帮助。我正在使用 pthreads 编写 c++ 代码。以下是其中一种方法的概述

void Method1()
{
    try
    {
    pthread_mutex_lock(&syncLock);
    statement1;
    statement2;
    pthread_mutex_unlock(&syncLock);
    statement3;
    statement4;
    }
    catch(exception& e)
    {
    log error
    }
}

其中syncLock 的类型为pthread_mutex_t,并使用默认初始化进行初始化。

我的问题是,如果在方法的语句 2 中抛出异常,则控制直接传递给 catch 语句。在这种情况下,我的互斥锁保持锁定状态。但我也不能简单地在 catch 块中编写解锁语句,因为如果异常来自语句 3,则互斥锁已被解锁,并且在已解锁的互斥锁上调用 unlock 会导致未定义的行为。

那么有没有办法可以在 catch 语句中检查互斥锁是否已解锁。或者,C++ 中是否有可用的 C# 样式锁语句替代方案,所以我确信即使从该块中抛出异常也会释放锁

我不倾向于为此目的使用库。一个简单的自定义解决方案将不胜感激

谢谢

【问题讨论】:

    标签: c++ pthreads


    【解决方案1】:

    编写一个小型 RAII 风格的储物柜类:

    class lock { 
        pthread_mutex_t &mutex;
    public:   
        lock(pthread_mutex_t &m) :mutex(m) { pthread_mutex_lock(&mutex); }
        ~lock() { pthread_mutex_unlock(&mutex); }
    };
    

    然后编写如下代码:

    void Method1()
    {
        try
        {
            { 
                lock l(syncLock);
                statement1;
                statement2;
             }
             statement3;
             statement4;    
        }
        catch(exception& e)
        {
        log error
        }
    }
    

    当您退出定义锁的作用域时,锁将通过析构函数销毁,从而调用pthread_mutex_unlock。无论您是正常退出范围还是通过异常退出,都会发生这种情况。当您进入异常处理程序时,您就知道互斥锁已被解锁。

    请注意,C++11 已将其作为 std::lock_guard 内置到标准库中(并且有许多互斥类型可供使用)。

    【讨论】:

      【解决方案2】:

      使用 pthread_mutex_trylock 如果互斥锁已被锁定,它将给出忙碌状态。如果它没有锁定,那么它将锁定它。 在此解锁互斥锁之后。 pthread_mutex_unlock(pthread_mutex_t *mutex);

      【讨论】:

      • 这是正确的,但不是一个好主意。 (或者可能是错误的问题。)stackoverflow.com/questions/4362459/…@JerryCoffin 的答案是要走的路。
      • 是的,这是个错误的问题。该人在正文中提出的问题与在标题中提出的问题截然不同;这个答案只对问题的标题是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多