静态TLS和动态TLS
静态TLS的使用方法:
#include <Windows.h> #include <iostream> #include <iomanip> using namespace std; CRITICAL_SECTION g_cs; // 定义静态TLS全局变量 __declspec(thread) int value = 0 ; DWORD WINAPI NewThread ( LPVOID lParam ) { // 设置子线程value为10,并不影响主线程 value = 10; int array[8]; for (int loop = 0; loop < 8; loop++) { array[loop] = value++; } DWORD dwThreadID = GetCurrentThreadId(); EnterCriticalSection(&g_cs); for (loop = 0; loop < 8; loop++) { // 取得子线程静态TLS的值 cout << "子线程 0x" << setw(4) << setfill('0') << hex << dwThreadID; cout << " value=" << dec << array[loop] << endl ; } cout << endl; LeaveCriticalSection(&g_cs); return 0 ; } #define THREAD_NUM 3 int main(int argc, char* argv[]) { InitializeCriticalSection(&g_cs); // 设置主线程静态TLS的value为5 value = 5 ; // 创建子线程 HANDLE hThread[THREAD_NUM]; for (int loop = 0; loop < THREAD_NUM; loop++) { hThread[loop] = CreateThread ( NULL, 0, NewThread, NULL, 0, NULL ) ; } // 等待直到子线程结束 WaitForMultipleObjects(THREAD_NUM, hThread, TRUE, INFINITE); // 取得主线程静态TLS的值 cout << "主线程 0x" << setw(4) << setfill('0') << hex << GetCurrentThreadId(); cout << " value=" << dec << value << endl ; DeleteCriticalSection(&g_cs); return 0; }
动态TLS的使用方法:
#include <windows.h> #include <iostream> #include <iomanip> using namespace std ; CRITICAL_SECTION g_cs; // 全局变量保存TLS时隙索引值 // 约定所有线程都使用TLS的这个时隙 UINT nTlsIndex = 0 ; DWORD WINAPI NewThread ( LPVOID lParam ) { int value = 10; int array[8]; for (int loop = 0; loop < 8; loop++) { // 设置子线程TLS值 TlsSetValue ( nTlsIndex, (LPVOID)value) ; array[loop] = (int)TlsGetValue(nTlsIndex ); value++; } DWORD dwThreadID = GetCurrentThreadId(); EnterCriticalSection(&g_cs); for (loop = 0; loop < 8; loop++) { // 取得子线程静态TLS的值 cout << "子线程 0x" << setw(4) << setfill('0') << hex << dwThreadID; cout << " value=" << dec << array[loop] << endl ; } cout << endl; LeaveCriticalSection(&g_cs); return 0 ; } #define THREAD_NUM 3 int main(int argc, char* argv[]) { InitializeCriticalSection(&g_cs); // 动态分配TLS时隙 nTlsIndex = TlsAlloc() ; if ( nTlsIndex != TLS_OUT_OF_INDEXES ) { cout << "TLS时隙为" << nTlsIndex << endl ; // 主线程TLS指定时隙的值 TlsSetValue ( nTlsIndex, (LPVOID)5 ) ; // 创建子线程 HANDLE hThread[THREAD_NUM]; for (int loop = 0; loop < THREAD_NUM; loop++) { hThread[loop] = CreateThread ( NULL, 0, NewThread, NULL, 0, NULL ) ; } // 等待直到子线程结束 WaitForMultipleObjects(THREAD_NUM, hThread, TRUE, INFINITE); // 取得主线程静态TLS的值 cout << "主线程 0x" << setw(4) << setfill('0')<< hex << GetCurrentThreadId() << endl; cout << dec << nTlsIndex << "号TLS时隙值为" << (DWORD)TlsGetValue(nTlsIndex ) << endl; // 不使用时应该释放TLS时隙 TlsFree ( nTlsIndex ) ; } else { cout << "没有可用的TLS时隙!" << endl ; } return 0; }