2013-01-11 111 views
3

我很确定这是一个天真的问题,但仍然会问这个问题,因为我在网上找不到太多帮助。我正在使用pthreads编写一个C++代码。以下是所述方法如何检查pthread_mutex_t是否被锁定

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块中写入一个解锁语句,因为如果异常来自语句3,那么互斥锁已被解锁,并且对已经解锁的互斥锁调用解锁会导致未定义的行为。

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

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

感谢

回答

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(并且具有多个可与之一起使用的互斥类型)。

+0

感谢您的解决方案! –

1

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

+1

这是正确的,但一个坏主意。 (或者也许是错误的问题。)http://stackoverflow.com/questions/4362459/check-to-see-if-a-pthread-mutex-is-locked-or-unlocked-after-a-thread-has-锁定/ 4362475#4362475 @杰里柯芬的答案是要走的路。 – asveikau

+0

是的,这是一个错误的问题。这个人在标题中提出了一个非常不同的问题。这个答案对于问题的标题是正确的。 – codetaku

相关问题