初学线程,TlsSetValue

C/C++ code

// Test.cpp : 定义控制台应用程序的入口点。 // #include " stdafx.h " using namespace std; // 利用TLS记录线程的运行时间 DWORD g_tlsUsedTime; void InitStartTime(); DWORD GetUsedTime(); UINT __stdcall ThreadFunc(LPVOID) { int i; // 初始化开始时间 InitStartTime(); // 模拟长时间工作 i = 10000 * 10000 ; while (i -- ) { } // 打印出本线程运行的时间 printf( " This thread is coming to end. Thread ID: %-5d, Used Time: %d /n " , ::GetCurrentThreadId(), GetUsedTime()); return 0 ; } int _tmain( int argc, _TCHAR * argv[]) { UINT uId; int i; HANDLE h[ 10 ]; // 通过在进程位数组中申请一个索引,初始化线程运行时间记录系统 g_tlsUsedTime = ::TlsAlloc(); // 令十个线程同时运行,并等待它们各自的输出结果 for (i = 0 ; i < 10 ; i ++ ) { h[i] = (HANDLE)::_beginthreadex(NULL, 0 , ThreadFunc, NULL, 0 , & uId); } for (i = 0 ; i < 10 ; i ++ ) { ::WaitForSingleObject(h[i], INFINITE); ::CloseHandle(h[i]); } // 通过释放线程局部存储索引,释放时间记录系统占用的资源 ::TlsFree(g_tlsUsedTime); return 0 ; } // 初始化线程的开始时间 void InitStartTime() { // 获得当前时间,将线程的创建时间与线程对象相关联 DWORD dwStart = ::GetTickCount(); ::TlsSetValue(g_tlsUsedTime, (LPVOID)dwStart); } // 取得一个线程已经运行的时间 DWORD GetUsedTime() { // 获得当前时间,返回当前时间和线程创建时间的差值 DWORD dwElapsed = ::GetTickCount(); dwElapsed = dwElapsed - (DWORD)::TlsGetValue(g_tlsUsedTime); return dwElapsed; }


InitStartTime函数里,::TlsSetValue(g_tlsUsedTime, (LPVOID)dwStart);,tlsUsedTime都是一样的,不是很理解,这个是怎么个过程
This function allocates a thread local storage (TLS) index. 

Any thread of the process can subsequently use this index to store and retrieve values that are local to the thread. 

DWORD TlsAlloc(void); 

就是得到一个时间点,各个线程运行完后的时间减去它
C/C++ code

g_tlsUsedTime = ::TlsAlloc(); dwElapsed = dwElapsed - (DWORD)::TlsGetValue(g_tlsUsedTime);
TLS是线程本地存储的意思,同一个索引不同的线程可以存不同的值进去。

::TlsSetValue(g_tlsUsedTime, (LPVOID)dwStart) ;
g_tlsUsedTime只是一个TLS索引,它在main函数里申请的;
虽然都是g_tlsUsedTime,在不同线程里调用TlsSetValue是把值存到不同的地方去的,TlsGetValue也是从不同地方取值。

这就是线程本地存储的意义
转自 http://topic.csdn.net/u/20101029/17/5db5dd3a-dc66-4448-b050-01d64dcda23a.html

你可能感兴趣的:(VC)