windows核心程式設計 執行緒的TLS

2021-07-25 02:09:25 字數 805 閱讀 7466

tls:thread local storage 執行緒本地儲存

本質:對於一些全域性變數,為每乙個執行緒分配乙個例項,各執行緒只使用自己的例項,而不用去爭搶那乙個全域性變數的例項

tls的真實一億在於不用為每個執行緒去定義乙個全域性匾蛉,而使用特殊關鍵字或者api自動為每個執行緒例項分配私有的全域性變數,

這對一些特殊演算法非常有意義,尤其是在預先不知道到底又多少執行緒要執行的情況下

關鍵字法:

__declspec(thread) int tls_i=1;

動態api的方法:

1、使用tlsalloc函式為每個全域性變數分配乙個tls索引(該索引在整個程序中唯一,對於所有執行緒來說同乙個索引代表相同含義

的全域性變數);

注:相當於為每個執行緒使用_beginthreadex為執行緒分配了乙個_tiddata記憶體塊,同時結束的時候和_endthreadex相搭配

dword dwtlsindex=tlsalloc();

2、使用tlssetvalue將該執行緒的值放入到對應索引的全域性變數,替代直接存值在全域性變數的操作

tlssetvalue(dwtlsindex,panydata);

3、使用tlsgetvalue從指定索引處取出該執行緒之前存入的值

panydata=tlsgetvalue(dwtlsindex)

4、使用tlsfree釋放tls的索引

tlsfree(dwtlsindex)

關鍵字法以來於vc++編譯器,而api方法則可以在任何可以呼叫api的語言環境中可用

相對來說關鍵字法更易於理解和使用適合改造一些以來全域性變數的非多執行緒安全的庫。

《windows核心程式設計》 執行緒棧

當系統建立執行緒的時候,會為執行緒棧預訂一塊位址空間區域,並給該區域調撥一些物理儲存器。缺省會預訂1mb的位址空間並調撥兩個頁面的儲存器。但是在構建 應用程式的時候可以改變這個預設值 在構建應用程式的時候鏈結器會把棧的大小寫入到exe和dll檔案的pe檔案頭中,當建立執行緒的時候會根據pe檔案頭中的...

windows 核心程式設計 執行緒的優先順序

每個執行緒都會被賦予乙個從0 最低 到31 最高 的優先順序號碼.當系統確定將哪個執行緒分配給cpu的時候,它首先觀察優先順序為31的執行緒,並以迴圈的方式對它們進行系統呼叫.如果優先順序為31的執行緒可以排程,那麼就賦予該執行緒乙個cpu時間片.在該執行緒的時間片結束的時候,系統要檢視是否還有另乙...

Windows核心程式設計

內容簡介 這是一本經典的windows核心程式設計指南,從第1版到第5版,引領著數十萬程式設計師走入windows開發陣營,培養了大批精英。作為windows開發人員的必備參考,本書是為打算理解windows的c和c 程式設計師精心設計的。第5版全面覆蓋windows xp,windows vist...