线程局部存储技术
TLSAlloc 功能:在本进程 中的 线程本地存储区的位标示数组中 找到一个是否可以用的。
如果找到,则去该标示位 对应着的 的线程数组中找索引,如果找到,则返回索引。
我发一个图给大家看。
问题:TlSAlloc是进程分配的, 我提供的代码是在主线程中使用,
4个线程用到了dwTlsIndex,dwTlsIndex 的值是一样的。
4个线程,应该是在主线程中调用四次Tlsalloc,进行分配到4个,然后
4个线程各自使用自己的。
tlsalloc 是查找标志位,然后再标志位对应的数组中查找。
即:返回我提供的图中的 竖着的数组的索引,不是返回横着的那个数组的
索引。
难道我理解错了吗??
#include <windows.h>#include <stdio.h>#define THREADCOUNT 4DWORD dwTlsIndex;VOID ErrorExit(LPSTR); DWORD WINAPI ThreadFunc(VOID){ LPVOID lpvData; // Initialize the TLS index for this thread. lpvData = (LPVOID) LocalAlloc(LPTR, 256); if (! TlsSetValue(dwTlsIndex, lpvData)) ErrorExit("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;} int main(VOID){ DWORD IDThread; HANDLE hThread[THREADCOUNT]; int i; // Allocate a TLS index. if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) ErrorExit("TlsAlloc failed"); // Create multiple threads. for (i = 0; i < THREADCOUNT; i++) { hThread[i] = CreateThread(NULL, // default security attributes 0, // use default stack size (LPTHREAD_START_ROUTINE) ThreadFunc, // thread function NULL, // no thread function argument 0 , // use default creation flags &IDThread); // returns thread identifier // Check the return value for success. if (hThread[i] == NULL) ErrorExit("CreateThread error\n"); } for (i = 0; i < THREADCOUNT; i++) WaitForSingleObject(hThread[i], INFINITE); TlsFree(dwTlsIndex); return 0;}VOID ErrorExit (LPSTR lpszMessage){ fprintf(stderr, "%s\n", lpszMessage); ExitProcess(0);}