网站建设 局部放大镜功能,建设项目所在地公共媒体网站,wordpress如何上传mp3,免费网站建设能做吗线程本地存储#xff08;TLS#xff09;使同一进程的多个线程能够使用由TlsAlloc函数分配的索引来存储和检索线程本地的值。在此示例中#xff0c;在进程启动时分配索引。当每个线程启动时#xff0c;它会分配一个动态内存块#xff0c;并使用TlsSetValue函数在TLS槽中存储…线程本地存储TLS使同一进程的多个线程能够使用由TlsAlloc函数分配的索引来存储和检索线程本地的值。在此示例中在进程启动时分配索引。当每个线程启动时它会分配一个动态内存块并使用TlsSetValue函数在TLS槽中存储指向此内存的指针。CommonFunc函数使用TlsGetValue函数来访问与调用线程本地的索引相关联的数据。在每个线程终止之前它会释放其动态内存。在进程终止之前它会调用TlsFree来释放索引。
#include windows.h
#include stdio.h #define THREADCOUNT 4
DWORD dwTlsIndex; VOID ErrorExit(LPSTR); VOID CommonFunc(VOID)
{ LPVOID lpvData; // Retrieve a data pointer for the current thread. lpvData TlsGetValue(dwTlsIndex); if ((lpvData 0) (GetLastError() ! ERROR_SUCCESS)) ErrorExit(TlsGetValue error); // Use the data stored for the current thread. printf(common: thread %d: lpvData%lx\n, GetCurrentThreadId(), lpvData); Sleep(5000);
} 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);
}
相关话题
在动态链接库中使用线程本地存储