1. 程式人生 > >執行緒區域性儲存(TLS)

執行緒區域性儲存(TLS)

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;
}