程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Effective C++ Item 14

Effective C++ Item 14

編輯:關於C++

Item 14-在資源管理中小心的copying行為(Think carefully about copying behavior in resource-managing classes)

auto_ptr和trl::shared_ptr表現在heap_based資源上,然而並非所有資源都是heap_based,這樣我們就需要建立自己的資源管理類。

例如:假設我們使用C API(Application Programming Interface)函數處理類型為Mutex的互斥器對象(mutex objects),共有lock和unlock兩函數可用:

void lock(Mutex* pm);      //鎖定pm所指的互斥器
void unlock(Mutex* pm);    //將互斥器解除鎖定

Note:Mutex是Windows中用於對線程控制的互斥量。意思是只能有一個線程取得對它的占有權,因為有些業務只允許一個線程進行控制。打個比方:一個房間每次只允許一個人進去,而當有多個人需要使用那個房間時,就需要進行控制,其他人必須排隊,這個控制就需要設置一個互斥量。

 

為確保絕不忘記將一個被鎖住的Mutex解鎖,你可能會希望建立一個class用來管理機鎖。這樣的class的基本結構由RAII守則支配,也就是"資源在構造期間獲得,在析構期間釋放"。

 

class Lock
{
public:
    explicit Lock(Mutex* pm):mutexPtr(pm){Lock(mutexPtr);}    //獲得資源
    ~Lock(){unlock(mutexPtr);}    //釋放資源
private:
    Mutex* mutexPtr;
};
客戶對Lock的用法符合RAII方式:

 

 

Mutex m;             //定義你需要的互斥器
...
{                    //建立一個區塊用來定義critical section
    Lock ml(&m);     //鎖定互斥器
    ...              //執行critical section內的操作
}                    //在區塊最末尾,自動解除互斥器鎖定
Note:critical section臨界區。不論是硬件臨界資源,還是軟件臨界資源,多個線程必須互斥地對它進行訪問。每個線程中訪問臨界資源的那段代碼成為臨界區。

 

如果Lock對象被復制;

 

Lock ml1(&m)      //鎖定m
Lock ml2(ml1)     //將ml1復制到ml2身上。?怎麼辦

四種選擇;

 

1、禁止復制

2、將底層資源使用"引用計數法"(reference-count)

3、復制底部資源

4、轉移底部資源的擁有權

 

請記住:

復制RAII對象必須一並復制它所管理的資源,所以資源的copying行為決定RAII對象的copying行為。

普遍而常見的RAII class copying行為是:抑制copying、使用引用計數法(reference counting)。不過其他行為也都可能被實現。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved