執行緒區域性儲存(TLS)
阿新 • • 發佈:2018-12-31
1. 執行緒區域性儲存(TLS)是簡單的儲存執行緒區域性資料的系統。
2. 利用TLS可以為每個程序關聯一個數據。一般來說,為執行緒分配TLS索引在主執行緒中完成,而分配的索引值應儲存在全域性變數中。
3. 使用到的函式介紹:
1) 主執行緒呼叫TlsAlloc為執行緒區域性儲存分配索引;
2) 每個執行緒呼叫TlsSetValue和TlsGetValue設定或讀取執行緒陣列中的值;
3) 主執行緒釋放TLS:TlsFree();
4) GetCurrentThreadId();得到當前執行執行緒的ID號;
5) GetTIckCount():得到Windows從啟動到現在經過的時間,以毫秒為單位;
4. 程式例項:為每個執行緒關聯自己的啟動時間,輸出每個執行緒的執行時間;
#include <iostream> #include <windows.h> #include <process.h> using namespace std; DWORD dwTls; DWORD GetRunningTime() { DWORD cdw = ::GetTickCount(); cdw = cdw - (DWORD)::TlsGetValue(dwTls); return cdw; } void InitTime() { DWORD dw = ::GetTickCount(); ::TlsSetValue(dwTls,(LPVOID)dw); } UINT WINAPI ThreadProc(LPVOID) { int i = 10000*10000; InitTime(); while(i) i--; cout << "the threadID is "<<::GetCurrentThreadId()<<"time is "<<GetRunningTime()<<endl; return 0; } int _tmain(int argc, _TCHAR* argv[]) { HANDLE h[10]; dwTls = ::TlsAlloc(); int i ; for(i = 0;i < 10;i++) { h[i] = (HANDLE)::_beginthreadex(NULL,NULL,ThreadProc,NULL,0,NULL); } for(i = 0;i < 10;i++) { ::WaitForSingleObject(h[i],INFINITE); ::CloseHandle(h[i]); } ::TlsFree(dwTls); system("pause"); return 0; }