TlsAlloc
TlsFree
TlsGetValue
TlsSetValue

 例子:

 

 

 

#include <stdio.h> 
#include <windows.h> 

#define THREADCOUNT 2
DWORD dwTlsIndex;

VOID ErrorExit(LPCWSTR lpszMessage)
{
    fprintf(stderr, "%s\n", lpszMessage);
    ExitProcess(0);
}

VOID CommonFunc(VOID)
{
    LPVOID lpvData;

    lpvData = TlsGetValue(dwTlsIndex);
    if ((lpvData == 0) && (GetLastError() != ERROR_SUCCESS))
        ErrorExit(L"TlsGetValue error");

    printf("common: thread %d: lpvData=%lx\n",
        GetCurrentThreadId(), lpvData);

    Sleep(5000);
}

DWORD WINAPI ThreadFunc(VOID)
{
    LPVOID lpvData;
    lpvData = (LPVOID)LocalAlloc(LPTR, 256);
    if (!TlsSetValue(dwTlsIndex, lpvData))
        ErrorExit(L"TlsSetValue error");

    printf("thread %d: lpvData=%lx\n", GetCurrentThreadId(), lpvData);

    CommonFunc();

    // Release the dynamic memory before the thread returns. 

    lpvData = TlsGetValue(dwTlsIndex);
    if (lpvData != 0)
        LocalFree((HLOCAL)lpvData);

    return 0;
}

DWORD main(VOID)
{
    DWORD IDThread;
    HANDLE hThread[THREADCOUNT];
    int i;

    //申请TLS索引 
    if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
        ErrorExit(L"TlsAlloc failed");


    for (i = 0; i < THREADCOUNT; i++)
    {
        hThread[i] = CreateThread(NULL, 
            0,                           
            (LPTHREAD_START_ROUTINE)ThreadFunc, 
            NULL,                    
            0,                       
            &IDThread);              

        if (hThread[i] == NULL)
            ErrorExit(L"CreateThread error\n");
    }

    for (i = 0; i < THREADCOUNT; i++)
        WaitForSingleObject(hThread[i], INFINITE);

    TlsFree(dwTlsIndex);

    return 0;
}