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;
}