以STL map實現引用表的一種方式

2021-07-09 11:42:11 字數 1645 閱讀 9009

一直受惠於easydarwin開源專案,因此把自己的一些想法分享出來,希望能夠幫助到其他人。

之前在推流測試中出現引用表異常的情況,經跟蹤發現是內部封裝的雜湊表的hash函式對於傳入的字串無法得到乙個唯一的key,下面是具體的hash函式

uint32  osreftableutils::hashstring(strptrlen* instring)

其實對於hash函式本沒沒有什麼錯誤,但我們的應用場景是對於乙個傳入的不同字串引數,總能夠可以進行快速的查詢、插入等,而hash表從本質上來說是不可能避免衝突的,因此在此考慮使用在map的基礎上來設計引用表。

在引用表的設計中參考了原darwin的設計,並保持介面幾乎一致,這樣就比較便於修改。其中關鍵點有兩個:1是對map的互斥和同步操作,在資料結構的設計上加入了互斥操作,可以放心的去呼叫。2是當釋放物件時,該物件的引用必須為0,否則會產生不可想象的錯誤。下面看一下具體實現

#include "oscond.h"

#include "osheaders.h"

class osreftableex

osrefex(void * pobject):mp_object(pobject),m_count(0){}

public:

void *getobjectptr()

int getrefnum()

oscond *getcondptr()

void addref(int num)

};private:

mapm_map;//以string為key,以osrefex為value

osmutex m_mutex;//提供對map的互斥操作

public:

osrefex * resolve(string keystring);//引用物件

os_error release(string keystring);//釋放引用

os_error register(string keystring,void* pobject);//加入到map中

os_error unregister(string keystring);//從map中移除

os_error tryunregister(string keystring);//嘗試移除,如果引用為0,則移除並返回true,否則返回false

public:

int getelenuminmap()//獲得map中的元素個數

osmutex *getmutex()//給外面提供互斥介面

map*getmap()

};

可以看到,引用表封裝的map的key和value型別分別為string和osrefex*,使用string作為key是為了滿足應用場景以及方便對原引用表進行修改,比較重要的是作為value的

osrefex*型別。osrefex的設計參考了原osref類,提取了3個重要的屬性來作為其成員變數。mp_object表示string對應的物件指標,

m_count表示了對引用物件的引用次數,而

m_cond用於安全的來進行引用和釋放引用。

有了osrefex的設計,那麼對於引用表的操作就是一些簡單的map的增、刪、查詢操作了,相信對照**一定可以看的很明白。

一種分頁的實現

以下 是一種分頁的實現。分別是檔案page.php和page.css。分頁的糾結點在於分頁條中省略號的顯示。實現的基本邏輯是 1,接收瀏覽器端傳過來的想要顯示的頁碼數 page。page get p 2,根據頁碼數 page 以及固定的每頁顯示數 pagesize 從資料庫中取資料。sql sele...

有序鍊錶的合併的一種實現

概述 合併有序鍊錶的一種實現 在leetcode刷題的時候,碰到有序鍊錶的合併問題,第21題是兩個鍊錶的合併,第23提是k個鍊錶的合併,第23題利用第21題的解法,將兩個鍊錶合成乙個,再把合成的鍊錶作為新煉表和下乙個鍊錶合併即可。合併鍊錶有很多方法 a.將所有節點拆開,放到陣列裡進行排序,再放回鍊錶...

一種登錄檔沙箱的思路 實現

在作業系統中,我們對乙個物件 檔案 登錄檔鍵等 的操作存在 建立 開啟 關閉 修改 刪除 和 查詢 等。這些操作的源便是那個物件,重定向 思路就是針對這個物件 作手腳 說得通俗點,就是通過 狸貓換太子 的方式達到欺騙上層的目的。以後有什麼操作,我們便是對這個 狸貓 去作,從而達到保護 太子 的目的。...