如何检查pthread_mutex_t是否被锁定

时间:2013-01-11 06:35:50

标签: c++ pthreads

我很确定这是一个天真的问题,但仍然会问它,因为我无法在网上找到很多帮助。我正在使用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,并使用默认初始化进行初始化。

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

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

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

由于

2 个答案:

答案 0 :(得分:6)

写一个小型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内置到标准库中(并且可以使用多种互斥体类型)。

答案 1 :(得分:1)

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