TLS(thread - local storage)线程局部存储

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:55   1148   0

线程局部存储是一个使用很方便的存储线程局部数据的系统。利用TLS机制可以为进程中所有的线程关联若干数据,各个线程通过由TLS分配的全部索引来访问与自己关联的数据。这样,每个线程都可以有线程局部的静态存储数据。

动态使用TLS的典型步骤如下:

(1)主线程调用TlsAlloc函数为线程局部存储分配索引,函数原形为:

DWORD TlsAlloc( void );//返回一个TLS索引

TlsAlloc()返回的是数组成员的下标,初始状态下,数组成员都是FREE状态,TlsAlloc()会区找FREE状态的数组成员,然后把它改为INUSE,TLS返回该数组的索引。如果没有找到FREE,就返回TLS_OUT_INDEXES。

(2)每个线程调用TlsSetValue和TlsGetValue设置或读取线程数组中的值,函数原形为:

BOOL TlsSetValue(DWORD dwTlsIndex, //TLS索引

LPVOID lpTlsValue //要设置的值

);

LPVOID TlsGetValue(DWORD dwTlsIndex); //TLS索引

(3)主线程调用TlsFree释放局部存储索引。

#include <stdio.h> #include <windows.h> #include <process.h> //利用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: %d-5d,Used Time: %d/n", GetCurrentThreadId(),GetUsedTime()); return 0; } int main(int argc ,char* argv[]) { UINT uId; int i ; HANDLE h[10]; //通过在进程位数组中申请一个索引,初始化线程运行的时间记录系统 g_tlsUsedTime = ::TlsAlloc(); //令十个线程同时运行,等待他们各自输出结果 for(i = 0; i<10;i++) { h[i] = (HANDLE)::_begithreadex(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; }

GetTickCount函数是获取Windows从启动开始经过的时间,其返回值是以毫秒位单位的已启动的时间。

转载于:https://www.cnblogs.com/leven20061001/archive/2011/05/28/2724724.html

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP