構造解構函式的妙用-成對出現 (轉)
構造析構的妙用--成對出現
考慮這樣一段程式碼:
void some_func()
{
lock(key);
……
……
unlock(key);
}
由於對some_func的不能併發訪問,所以在的開始處加上鎖key,只有key處
於解鎖狀態,lock才可以返回,當函式完畢後unlock,其他程式lock
方能成功,從而可以得以執行some_func。
在函式體內如果出現這樣的情況:
void some_func()
{
lock(key);
.....
if(something)
return;
.....
unlock(key);
}
函式某些條件的判斷而返回,這樣,some_func存在了大於一個返回點,這樣由
於沒有執行unlock操作,其他程式或本程式對some_func的再次訪問將被死鎖而
永遠無法得以執行。
如果我們這樣解決問題:
void some_func()
{
lock(key);
.....
if(something)
{
unlock(key);
return;
}
.....
unlock(key);
}
這樣可以解決部分問題,但是如果函式返回點很多,就需要在每個返回點進行
解鎖unlock操作,很麻煩,同時它還存在如下問題:
void some_func()
{
lock(key);
....
my_func();//由其他員實現的函式。
.....
unlock(key);
}
看起來一點問題也沒有,但是如果my_func()丟出異常呢?
如果我們函式里沒有捕獲這個異常的話 ,它會導致 some_func 函式在呼叫
my_func的這一點中斷。那麼只能在每個可能丟擲異常的函式呼叫點用 try 捕
獲所有異常,然後在 catch 裡面解鎖,再重新丟擲。顯然,這樣的解法實在是
太繁瑣、太容易引入錯誤了。
如果我們這樣考慮,鎖和解鎖的操作是要成對出現的,而對於一個類而講,構
造和解構函式也是成對出現的,我們可以這樣設計:
class auto_lock
{
public:
auto_lock(lock_t key) : m_key(key)
{
lock(m_key);// 構造時加鎖
}
~auto_lock()
{
unlock(m_key)// 析構時解鎖
}
private:
lock_t m_key;
}
void some_func()
{
auto_lock my_lock(key);
……
// return 、foo ,隨便什麼東西都行
……
// 結束的時候同樣不用解鎖
}
由於my_lock是一個區域性變數,他的生命週期在函式some_func內,不論some_fu
nc以什麼樣的方式退出,my_lock都將被銷燬,解構函式被執行,鎖被解開,徹
底解決了死鎖的問題,解決的很完美。
同樣在其他有成對出現的情況下都可以考慮使用構造和解構函式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-963005/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 構造java函式(轉)Java函式
- 構造和解構函式呼叫順序函式
- 直譯器構造實現函式呼叫函式
- 建構函式與解構函式函式
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- C/C++中的new/delete、構造/解構函式、dynamic_cast分析C++delete函式AST
- 關於建構函式與解構函式的分享函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- 用函式索引構造特殊的約束函式索引
- 類設計系列 --- 解構函式篇 (轉)函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- del解構函式函式
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- C++建構函式解構函式的執行過程C++函式
- 虛解構函式的作用函式
- 類的建構函式和解構函式函式
- 第八章:不要在構造和解構函式中使用虛擬函式函式
- C++解構函式C++函式
- 13-解構函式函式
- 函式、引數、解構函式
- 建構函式詳解函式
- 深入解構objc_msgSend函式的實現OBJGse函式
- C++ 移動構造和複製建構函式匹配C++函式
- C#中的解構函式C#函式
- C++之Big Three:拷貝構造、拷貝賦值、解構函式探究C++賦值函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 建構函式與解構函式是否可以丟擲異常函式
- 嬰兒的出生為你解惑建構函式和構造程式碼塊函式
- Day76.雜湊表、雜湊函式的構造 -資料結構函式資料結構
- C++ 建構函式和解構函式C++函式
- C#中解構函式,Close函式,Dispose函式的區別C#函式
- Java建構函式詳解Java函式
- 高質量C++/C程式設計指南(第9章 類的建構函式、解構函式與賦值函式) (轉)C++C程式程式設計函式賦值
- [cpp]C++中的解構函式C++函式
- 解構函式的標量與向量?函式
- Servlet呼叫構造方法,物件傳不進建構函式中去問題Servlet構造方法物件函式