스레드 로컬 스토리지 사용
TLS(스레드 로컬 스토리지)를 사용하면 동일한 프로세스의 여러 스레드가 TlsAlloc 함수에서 할당한 인덱스를 사용하여 스레드에 로컬인 값을 저장하고 검색할 수 있습니다. 이 예제에서는 프로세스가 시작될 때 인덱스가 할당됩니다. 각 스레드가 시작되면 동적 메모리 블록을 할당하고 TlsSetValue 함수를 사용하여 이 메모리에 대한 포인터를 TLS 슬롯에 저장합니다. CommonFunc 함수는 TlsGetValue 함수를 사용하여 호출 스레드에 로컬인 인덱스와 연결된 데이터에 액세스합니다. 각 스레드가 종료되기 전에 동적 메모리를 해제합니다. 프로세스가 종료되기 전에 TlsFree 를 호출하여 인덱스를 해제합니다.
#include <windows.h>
#include <stdio.h>
#define THREADCOUNT 4
DWORD dwTlsIndex;
VOID ErrorExit (LPCSTR message);
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 (LPCSTR message)
{
fprintf(stderr, "%s\n", message);
ExitProcess(0);
}
관련 항목