2012-05-23 43 views
0

有沒有什麼辦法可以編寫一對宏來獲取和釋放鎖,這樣gcc會警告我,如果我可以在不釋放之前在該函數中使用的鎖的情況下離開某個函數?確保釋放鎖的宏

+3

如果要確保始終釋放鎖,請使用C++和RAII。 –

+0

那有幫助嗎? – grifaton

+1

@ grifaton這是一個原因的評論。他也是對的。 –

回答

2

你可以聲明一個變量而不需要在初始化宏中初始化它,然後在最後的宏中初始化+使用它。如果您在gcc中使用了適當的設置(-Wall?),它會警告您已聲明但未初始化的變量。

請注意,如果您想在同一個函數中多次使用相同的宏對(例如,使用兩個鎖),您將需要指定一個不同的變量名稱,因此您不會得到一個關於重新聲明變量的錯誤

+0

有趣的想法,我會給它一些想法。 – grifaton

0

我想不出有什麼辦法讓編譯器爲你執行它,但總是可以使用宏而不是return關鍵字。像這樣:

#define RETURN(x) { if (locked()) unlock(); return x; } 

這就是說,我個人討厭這樣的宏,但它是一個選項。

1

假設你的函數(範圍)可能有多個return語句 - AFAIK沒有傳統的方法來做到這一點。

當然,在C++中沒有問題,您可以使用RAII(一種自動對象,可以在解碼器中解鎖)。

如果您爲Windows編寫代碼 - 您可以使用SEH包裝來確保資源釋放。它也可以正常使用異常(C++和SEH)。

__try 
{ 
    lock(/*...*/); 

    // ... 

    if (/* ... */) 
     return; 

} __finally { 
    unlock(/* ... */); 
} 
+0

這是這裏最正確的答案,主要是因爲它恰好適用於這種情況。然而,SEH異常方法是C語言的混淆,如果圖書館的消費者不知道發生了什麼,將會造成嚴重破壞。我想如果你從不用'扔'就沒關係...... –

0

GCC提供了一個cleanup屬性,它在變量超出範圍時調用一個函數。如果你有解鎖功能:

void unlock(lock_t *); 

你可以宣佈你的鎖爲:

lock_t lock __attribute__((cleanup, unlock)); 

當然C++的方式更便於攜帶和理解。