静态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;
}
原文地址:https://www.cnblogs.com/licb/p/TLS.html