您的位置:首页 > 产品设计 > UI/UE

初学线程,TlsSetValue

2011-05-25 16:20 183 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐