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