另乙個常見的 windows 2000 資料型別是 list_entry 結構。核心使用該結構將所有物件維護在乙個雙向鍊錶中。乙個物件分屬多個鍊錶是很常見的, flink 成員是乙個向前鏈結,指向下乙個 list_entry 結構,
blink 成員則是乙個向後鏈結,指向前乙個 list_entry 結構。
通常情況下,這些鍊錶都成環形,也就是說,最後乙個 flink 指向鍊錶中的第乙個 list_entry 結構,而第乙個 blink 指向最後乙個。這樣就很容易雙向遍歷該鍊錶。如果乙個程式要遍歷整個鍊錶,它需要儲存第乙個 list_entry 結構的位址,以判斷是否已遍歷了整個鍊錶。如果鍊錶僅包含乙個 list_entry 結構,那麼該 list_entry 結構必須引用其自身,也就是說, flink 和 blink 都指向其自己。
typedef struct _list_entry
list_entry, *plist_entry;
list_entry使用:
void linklisttest()
//從鍊錶中取出,並顯示
kdprint(("begin remove from link list/n"));
while(!islistempty(&linklisthead))
} 遍歷:
plist_entry plink=null;
for(plink = glinklistrule.flink; plink !=(plist_entry) &glinklistrule.flink; plink = plink->flink)
在驅動中使用鍊錶:
在驅動程式的開發中經常需要用到鍊錶,常見的鍊錶有單向鍊錶和雙向鍊錶,我們只介紹雙向鍊錶的使用方法,ddk為我們提供了標準的雙向鍊錶list_entry,但這個鍊錶裡面沒有資料,不能直接使用,我們需要自己定義乙個結構體型別,然後將list_entry作為結構體的乙個子域,如下所示:
typedef struct _mydatastruct mydatastruct, *pmydatastruct;
實際上把list_entry放在結構體的第乙個子域才是較好的做法,此處我們不過多地關心,反正用法都是大同小異。下面我們就在驅動程式中建立乙個鍊錶,使用剛剛定義的結構體作為節點型別。**如下所示:
void linklisttest()
// 從鍊錶中取出所有資料並顯示
kdprint(("[processlist] begin remove from link list/n"));
while(!islistempty(&linklisthead))
}上述**可以正常地通過編譯並執行,但其中存在著乙個很大的隱患:它不是多執行緒安全的。如果有多個執行緒同時操作同乙個鍊錶的話,可能會引發不可預料的後果,我們可以通過使用自旋鎖來避免,修改後的**如下所示:
void linklisttest()
// 解鎖,注意這裡的irql不是指標
kereleasespinlock(&spin_lock, irql);
//從鍊錶中取出所有資料並顯示
kdprint(("[processlist] begin remove from link list/n"));
// 鎖定
keacquirespinlock(&spin_lock, &irql);
while(!islistempty(&linklisthead))
// 解鎖
kereleasespinlock(&spin_lock, irql);
}上述**介紹了自旋鎖的使用方法,但需要注意的是:上面這段**在實際應用中是沒有任何價值的。因為在上述**我們定義的鎖是乙個區域性變數,被分配在棧中,這樣每個執行緒在呼叫該函式的時候,都會重新初始化乙個鎖,因此這個鎖就失去了本來的作用。在實際的程式設計中,我們應該把鎖定義成乙個全域性變數,或者靜態(static)變數,或者將其建立在堆空間中。
另外,我們還可以為每個鍊錶都定義並初始化乙個鎖,在需要向該鍊錶插入或移除節點時不使用前面介紹的普通函式,而是使用如下方法:
exinterlockedinsertheadlist(&linklisthead, &pdata->listentry, &spin_lock);
pdata = (pmydatastruct)exinterlockedremoveheadlist(&linklisthead, &spin_lock);
此時在向鍊錶中插入或移除節點時會自動呼叫關聯的鎖進行加鎖操作,有效地保證了多執行緒安全性。
資料型別基礎資料型別
資料型別 基礎型別 除八大基礎型別其他的都是引用型資料型別 引用資料型別 基礎資料型別 整型 byte 佔乙個位元組,範圍 128 127 short 佔兩個位元組,範圍 32768 32767 int 最常用 佔四個位元組,範圍 2147483648 2147483647 long 佔八個位元組 ...
資料型別 基本資料型別和引用資料型別
一.分類 1,五種簡單資料型別 基本資料型別 number,string,boolean,null,undefined,新增symbol es6 基本資料型別是指存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。1 undefined 宣告的變...
SQL 資料型別 MySQL 資料型別
在 mysql 中,有三種主要的型別 文字 數字和日期 時間型別。資料型別 描述char size 儲存固定長度的字串 可包含字母 數字以及特殊字元 在括號中指定字串的長度。最多 255 個字元。varchar size 儲存可變長度的字串 可包含字母 數字以及特殊字元 在括號中指定字串的最大長度。...