2013-01-11 110 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

相關問題