初学线程,TlsSetValue
2011-05-25 16:20
183 查看
C/C++ code
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
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
// 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
相关文章推荐
- 初学线程,TlsSetValue
- 问题解决[<UIViewController 0x8430220>setValue:forUndefinedKey:]this class is not key value..
- NSUnknownKeyException', reason: '[<UIApplication 0x8a58320> setValue:forUndefinedKey:]
- NgModelController: $setViewValue,$render,Formatter, Parser
- could not be set to a 'string' value. You must set this property to a non-null value of type
- java.lang.IllegalStateException: Web app root system property already set to different value .
- could not set nil as the value for the key verifyStatus
- Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=M
- setPartitionerClass、setOutputKeyComparatorClass 与 setOutputValueGroupingComparator
- Oracle OEM 配置报错: No value was set for the parameter DBCONTROL_HTTP_PORT 解决方法
- 线程本地存储 (TLS)
- 逐帧动画 补间动画 属性动画ObjectAnimator ValueAnimator AnimatorSet)演示 TypeEvaluator
- iOS: setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.
- ini_set、php_value、php_flag、php_admin_value、php_admin_flag修改php.ini参数
- C# 参考之上下文关键字get、set、value、partial、where和yield
- 线程创建、挂起、执行 TLS等14.4.28
- kettle Cannot find function setValue in object
- Manually Set Map Value in Struts 2
- SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍
- Memcached expire 设置错误引起的set(key,exp,value)为true而get(key)为null的问题