網路程式設計 作業系統 Linux下物件池的簡單實現

2021-10-07 14:56:14 字數 2724 閱讀 8750

大家應該對執行緒池,記憶體池等即便不知道原理,也有所耳聞了。同樣的,物件池的大概思路和執行緒池,記憶體池一樣。

以執行緒池為例子說明,假定有乙個服務端,一開始便分配了一定量的執行緒數(假設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...