zoukankan      html  css  js  c++  java
  • 静态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;
    }
  • 相关阅读:
    const 指针与指向const的指针
    Every breath you take
    数据结构之图(存储结构、遍历)
    六个前端开发工程师必备的Web设计模式/模块资源(转)
    mouseover和mouseout多次触发解决方法(兼容ie和firefox)(转)
    javascript DOM操作HTML文档
    Javascript 严格模式详解(转)
    你需要知道的三个 CSS3技巧(转)
    CommonJS规范(转)
    使用Yeoman,Grunt和Bower开发AngularJS(译)
  • 原文地址:https://www.cnblogs.com/licb/p/TLS.html
Copyright © 2011-2022 走看看