物件池的設計及其實現
物件池模型建立並擁有固定數量的物件,當程式需要乙個新的物件時,如果物件池中有空閒物件,則立即返回,否則才建立新的該類物件。當乙個物件不再被使用時,其應該應該將其放回物件池,以便後來的程式使用。由於系統資源有限,乙個物件池模型應該指定其可容納的最大物件數量。當達到該數量時,如果仍然有物件建立請求,則丟擲異常或者阻塞當前呼叫執行緒,直到乙個物件被放回物件池中。
(1)需要使用大量物件
(2)這些物件的例項化開銷比較大且生存期比較短
乙個物件池可以在可容忍時間內建立成功並投入使用。但是建立物件時並不總是這樣,尤其是當這些物件的建立過程比較耗時,而且建立和銷毀頻率又比較大時更是如此。比如資料庫連線、網路套接字連線、執行緒物件、諸如字型或位圖等影象物件等。
假設有如下類定義:
1如下物件池類的設計,用來提供object類物件,分為2個版本介紹:(注意,如下僅考慮了物件池本身所涉及的特性,沒有涉及同步控制機制)class
object28
9 ~object()
1013
14const
string& key() const
1516
private:17
string
name_;
18 };
版本1:
1objectpool的get函式返回map中key對應的object物件。如果該物件不存在,則新建乙個object,將其放入map中,然後返回這個新建的object。同時,重置shared_ptr(新增object物件)時指定析構器releaseobject,使得物件析構時執行releaseobject(object);class
objectpool215
return
pobject;16}
1718
private:19
void releaseobject(object* object)20
26delete
object;27
}2829 std::mapobjects_;
30 };
但是上述實現存在乙個問題:將this傳入bind函式中,如果objectpool物件先於object物件析構了,那麼在析構object物件時,如何呼叫releaseobject函式呢?(因為releaseobject函式屬於objectpool類)
版本2:
1要解決版本1中的問題,只需增加objectpool的壽命就可以了。可以利用boost::enable_shared_from_this模板類中的shared_from_this(),如此可以將this轉換為shared_ptr。如此,由於bind是值傳遞語義,因此其必然儲存乙份shared_ptr的副本,可以保證shared_ptr的引用計數不為0。class objectpool : public boost::enable_shared_from_this2
15return
pobject;16}
1718
private:19
void releaseobject(object* object)20
26delete
object;27
}2829 std::mapobjects_;
30 };
1references//object_pool.cc
2 #include 3
4 #include 5 #include 6 #include 7 #include 8
9 #include 10
11using std::string;12
const
int maxnum = 5; //
the largest amounts of objects
13int nums = 0; //
the current amounts of objects
1415
class
object
1622
23 ~object()
2427
28const
string& key() const
2930
private:31
string
name_;
32};
3334
35namespace
version1
3654
return
pobject;55}
5657
private:58
void releaseobject(object* object)59
66delete
object;67
}6869 std::mapobjects_;
70};
7172}73
74namespace
version2
7593
return
pobject;94}
9596
private:97
void releaseobject(object* object)98
105delete
object
;106
}107
108 std::mapobjects_;
109};
110111
}112
113114
intmain()
115131
132//
output
133construct object[003e1060] object1.
134construct object[003e10e0] object2.
135construct object[003e1160] object3.
136construct object[003e11e0] object4.
137construct object[003e1260] object5.
138releaseobject[003e1260].
139 ~destruct object[003e1260] object5.
140releaseobject[003e11e0].
141 ~destruct object[003e11e0] object4.
142releaseobject[003e1160].
143 ~destruct object[003e1160] object3.
144releaseobject[003e10e0].
145 ~destruct object[003e10e0] object2.
146releaseobject[003e1060].
147 ~destruct object[003e1060] object1.
code及其實現
1.what is code?編碼並不是我隨便亂取的名字,其原理在資訊檢索導論第5章第3節有介紹,用於壓縮一連串有序的數字型別的資料非常有用。在mg中將 編碼歸類為全域性模型 mg更推崇區域性模型 其原理是將所有的資料分成兩部分連起來,第一部分為資料長度,第二部分為資料內容。這樣做的好處是對於很小的...
程序及其實現
一 程序的定義 1 程序是可併發執行的程式在某個資料集合上的一次計算活動,也是作業系統進行資源分配和保護的基本單位 2 可以用來共享資源又能描述程式併發 為什麼要引入程序概念 1 刻畫程式的併發性 程式是併發執行的,這是由於資源共享和競爭問題,程式自身只是計算任務的指令和資料的描述,是靜態的,程序是...
跳表的原理及其實現
作用 目的 跳表作為一種資料結構通常用於取代平衡樹。起因平衡樹可以用於表示抽象的資料型別如字典和有序鍊錶,它通過樹旋轉 tree rotation 操作強制使樹結構保持平衡來保證節點搜尋的效率。在資料為隨機插入的情況下,平衡樹效能表現良好 但資料為順序插入或者需要刪除節點的情況下,平衡樹的效能就會有...