一. 线程局部存储
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;
}