大家應該對執行緒池,記憶體池等即便不知道原理,也有所耳聞了。同樣的,物件池的大概思路和執行緒池,記憶體池一樣。
以執行緒池為例子說明,假定有乙個服務端,一開始便分配了一定量的執行緒數(假設10個)。那麼,當有10個客戶端對服務端發起連線時。服務端便可直接將這10個客戶端分配給事先準備的10個執行緒,而不需要臨時建立10個執行緒,進而節省了大量的時間,同時也限制了一共可以處理的執行緒數,避免了資源過度占用。
物件池也是如此,**快取一些物件從而避免大量建立同乙個型別的物件,同時限制了例項的個數。**物件池在遊戲中就有常用的地方,如地圖重新整理時,就直接從物件池中直接拿出所有的怪物,而並非逐個建立怪物。
1. 物件型別體積較大。
2. 需要頻繁建立和銷毀物件,物件生命周期短。
3. 資源有限,不能一次性分配過多物件,所以設定物件池來限制物件的數量,同時增加物件的復用。
如上圖中,物件池的大小=空閒佇列(freepool)的大小+工作佇列(busypool)的大小。 同理的,當工作物件使用完畢後,我們只需要呼叫其析構函式來進行釋放。然後將該物件push回freepool佇列中。
/* objectpool.h */
#ifndef object_pool_h_
#define object_pool_h_
#include
#include
#include
#include
#include
#include
#include
#include
/* 定義物件池模板類 */
template
<
typename t>
class
objectpool
;template
<
typename t>
objectpool
::objectpool
(size_t chucksize)
:_chucksize
(chucksize)
for(size_t i =
0; i < _chucksize; i++)}
template
<
typename t>
objectpool::~
objectpool()
template
<
typename t>
void objectpool
::setchucksize
(size_t chucksize)
}else
}template
<
typename t>
void objectpool
::allocatechunk()
template
<
typename t>
std::shared_ptr objectpool
::assignobject()
if(_freeobjpool.
empty()
)/* 從空閒佇列的頭部取出乙個obj */
std::shared_ptr assignobj = _freeobjpool.
front()
;/* 出隊 */
_quemutex.
lock()
; _freeobjpool.
pop();
_quemutex.
unlock()
;return assignobj;
}template
<
typename t>
void objectpool
::releaseobject
(std::shared_ptr obj)
obj-
>~t
();/* 加入回空閒物件佇列 */
_quemutex.
lock()
; _freeobjpool.
push
(obj)
; _quemutex.
unlock()
;}template
<
typename t>
void objectpool
::destroypool()
_quemutex.
lock()
;for
(size_t i =
0; i < _chucksize; i++
) _quemutex.
unlock()
;}#endif
/* main.cpp */
#include
"objectpool.hpp"
class
test};
intmain()
命令列中執行如下命令編譯:
g++ main.cpp -o test -std=c++11.
/test
我們可以看到物件池建立成功了,從列印出來的ptest1和ptest2的位址看得出物件是多次復用的,遲點將佇列換成無鎖佇列。 linux下程式設計 作業系統 管道通訊
1 有名管道 乙個可以在檔案系統中長期存在的 具有路徑名的檔案。用系統呼叫mknod 建立。它克服無名管道使用上的侷限性,可讓更多的程序也能利用管道進行通訊。因而其它程序可以知道它的存在,並能利用路徑名來訪問該檔案。對有名管道的訪問方式與訪問其他檔案一樣,需先用open 開啟。2 無名管道 乙個臨時...
Linux作業系統下DriverDisk的製作方法
如果常常在ibm hp等這些伺服器上安裝linux,多多少少都會遇到需要手工載入scsi raid卡驅動情況,而我們遇到這種情況時,都會向硬體廠 商或者linux廠商需求驅動,因為幾乎所有的硬體廠商只提供redhat suse上的驅動,假如安裝的紅旗linux遇到這種情況,那麼就只能向紅旗 尋求驅動...
網路作業系統
1 網路作業系統 nos client server系統 1 lan manger 採用des資料加密標準 redirector與server。novell網路 redirector c向網路發出請求 message server。2 windows nt 需要vga,提供ipx傳輸協定,支援ras...