物件池的設計及其實現

2021-07-05 18:09:18 字數 3599 閱讀 4636

物件池的設計及其實現

物件池模型建立並擁有固定數量的物件,當程式需要乙個新的物件時,如果物件池中有空閒物件,則立即返回,否則才建立新的該類物件。當乙個物件不再被使用時,其應該應該將其放回物件池,以便後來的程式使用。由於系統資源有限,乙個物件池模型應該指定其可容納的最大物件數量。當達到該數量時,如果仍然有物件建立請求,則丟擲異常或者阻塞當前呼叫執行緒,直到乙個物件被放回物件池中。

(1)需要使用大量物件

(2)這些物件的例項化開銷比較大且生存期比較短

乙個物件池可以在可容忍時間內建立成功並投入使用。但是建立物件時並不總是這樣,尤其是當這些物件的建立過程比較耗時,而且建立和銷毀頻率又比較大時更是如此。比如資料庫連線、網路套接字連線、執行緒物件、諸如字型或位圖等影象物件等。

假設有如下類定義:

1

class

object28

9 ~object()

1013

14const

string& key() const

1516

private:17

string

name_;

18 };

如下物件池類的設計,用來提供object類物件,分為2個版本介紹:(注意,如下僅考慮了物件池本身所涉及的特性,沒有涉及同步控制機制)

版本1:

1

class

objectpool215

return

pobject;16}

1718

private:19

void releaseobject(object* object)20

26delete

object;27

}2829 std::mapobjects_;

30 };

objectpool的get函式返回map中key對應的object物件。如果該物件不存在,則新建乙個object,將其放入map中,然後返回這個新建的object。同時,重置shared_ptr(新增object物件)時指定析構器releaseobject,使得物件析構時執行releaseobject(object);

但是上述實現存在乙個問題:將this傳入bind函式中,如果objectpool物件先於object物件析構了,那麼在析構object物件時,如何呼叫releaseobject函式呢?(因為releaseobject函式屬於objectpool類)

版本2:

1

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 };

要解決版本1中的問題,只需增加objectpool的壽命就可以了。可以利用boost::enable_shared_from_this模板類中的shared_from_this(),如此可以將this轉換為shared_ptr。如此,由於bind是值傳遞語義,因此其必然儲存乙份shared_ptr的副本,可以保證shared_ptr的引用計數不為0。

1

//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.

references

code及其實現

1.what is code?編碼並不是我隨便亂取的名字,其原理在資訊檢索導論第5章第3節有介紹,用於壓縮一連串有序的數字型別的資料非常有用。在mg中將 編碼歸類為全域性模型 mg更推崇區域性模型 其原理是將所有的資料分成兩部分連起來,第一部分為資料長度,第二部分為資料內容。這樣做的好處是對於很小的...

程序及其實現

一 程序的定義 1 程序是可併發執行的程式在某個資料集合上的一次計算活動,也是作業系統進行資源分配和保護的基本單位 2 可以用來共享資源又能描述程式併發 為什麼要引入程序概念 1 刻畫程式的併發性 程式是併發執行的,這是由於資源共享和競爭問題,程式自身只是計算任務的指令和資料的描述,是靜態的,程序是...

跳表的原理及其實現

作用 目的 跳表作為一種資料結構通常用於取代平衡樹。起因平衡樹可以用於表示抽象的資料型別如字典和有序鍊錶,它通過樹旋轉 tree rotation 操作強制使樹結構保持平衡來保證節點搜尋的效率。在資料為隨機插入的情況下,平衡樹效能表現良好 但資料為順序插入或者需要刪除節點的情況下,平衡樹的效能就會有...