有沒有什麼辦法可以編寫一對宏來獲取和釋放鎖,這樣gcc會警告我,如果我可以在不釋放之前在該函數中使用的鎖的情況下離開某個函數?確保釋放鎖的宏
確保釋放鎖的宏
回答
你可以聲明一個變量而不需要在初始化宏中初始化它,然後在最後的宏中初始化+使用它。如果您在gcc中使用了適當的設置(-Wall
?),它會警告您已聲明但未初始化的變量。
請注意,如果您想在同一個函數中多次使用相同的宏對(例如,使用兩個鎖),您將需要指定一個不同的變量名稱,因此您不會得到一個關於重新聲明變量的錯誤
有趣的想法,我會給它一些想法。 – grifaton
我想不出有什麼辦法讓編譯器爲你執行它,但總是可以使用宏而不是return關鍵字。像這樣:
#define RETURN(x) { if (locked()) unlock(); return x; }
這就是說,我個人討厭這樣的宏,但它是一個選項。
假設你的函數(範圍)可能有多個return
語句 - AFAIK沒有傳統的方法來做到這一點。
當然,在C++中沒有問題,您可以使用RAII(一種自動對象,可以在解碼器中解鎖)。
如果您爲Windows編寫代碼 - 您可以使用SEH包裝來確保資源釋放。它也可以正常使用異常(C++和SEH)。
__try
{
lock(/*...*/);
// ...
if (/* ... */)
return;
} __finally {
unlock(/* ... */);
}
這是這裏最正確的答案,主要是因爲它恰好適用於這種情況。然而,SEH異常方法是C語言的混淆,如果圖書館的消費者不知道發生了什麼,將會造成嚴重破壞。我想如果你從不用'扔'就沒關係...... –
GCC提供了一個cleanup屬性,它在變量超出範圍時調用一個函數。如果你有解鎖功能:
void unlock(lock_t *);
你可以宣佈你的鎖爲:
lock_t lock __attribute__((cleanup, unlock));
當然C++的方式更便於攜帶和理解。
- 1. 不釋放鎖定保存對象?
- 2. 釋放互斥鎖。
- 3. IDirect3DDevice9釋放死鎖
- 4. 重入鎖釋放
- 5. SVN鎖不釋放
- 6. 如何確保實例未被釋放?
- 7. 確保鏈接列表已釋放
- 8. 檢測/確保SKB分配和釋放
- 9. 正確地釋放並保留NSString *
- 10. 併發:Condition.awaitNanos()不釋放鎖
- 11. Java - Thread.join()不釋放鎖
- 12. 如何釋放喚醒鎖?
- 13. flock(1)未能釋放鎖
- 14. H2數據庫釋放鎖
- 15. 鎖,工藝和釋放JDBC
- 16. StackExchange.Redis LockTake及鎖定釋放
- 17. 需要釋放互斥鎖?
- 18. 鎖不會被釋放
- 19. mysql - 行鎖定和釋放
- 20. 等待鎖定被釋放
- 21. CFLOCK中的CFRETURN是否正確釋放了鎖?
- 22. 什麼是正確的方式來釋放鎖在objective-c
- 23. CFDictionaryValueCallBacks保留/釋放?
- 24. 釋放和保留
- 25. PostgreSQL未釋放表中的鎖
- 26. 檢測couchbase中的鎖定釋放?
- 27. 在Sybase ASE中未釋放的鎖
- 28. 的Android喚醒鎖沒有被釋放
- 29. 如何釋放可能的Postgres行鎖?
- 30. T-SQL - 事務中的釋放鎖定
如果要確保始終釋放鎖,請使用C++和RAII。 –
那有幫助嗎? – grifaton
@ grifaton這是一個原因的評論。他也是對的。 –