第三章 线程局部存储 windows程序设计 王艳平版

///
// 02UseTLS.cpp.cpp文件

/*

动态调TLS的典型步聚:
1,主线程调用TlsAlloc函数为线程局部存储分配索引
DWORD TlsAlloc(void) 返回一个TLS索引 -1为失败


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: %-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)::_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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值