• TLS(Thread local storage)相关


    TlsAlloc
    TlsFree
    TlsGetValue
    TlsSetValue

     例子:

    #include <stdio.h> 
    #include <windows.h> 
    
    #define THREADCOUNT 2
    DWORD dwTlsIndex;
    
    VOID ErrorExit(LPCWSTR lpszMessage)
    {
        fprintf(stderr, "%s\n", lpszMessage);
        ExitProcess(0);
    }
    
    VOID CommonFunc(VOID)
    {
        LPVOID lpvData;
    
        lpvData = TlsGetValue(dwTlsIndex);
        if ((lpvData == 0) && (GetLastError() != ERROR_SUCCESS))
            ErrorExit(L"TlsGetValue error");
    
        printf("common: thread %d: lpvData=%lx\n",
            GetCurrentThreadId(), lpvData);
    
        Sleep(5000);
    }
    
    DWORD WINAPI ThreadFunc(VOID)
    {
        LPVOID lpvData;
        lpvData = (LPVOID)LocalAlloc(LPTR, 256);
        if (!TlsSetValue(dwTlsIndex, lpvData))
            ErrorExit(L"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;
    }
    
    DWORD main(VOID)
    {
        DWORD IDThread;
        HANDLE hThread[THREADCOUNT];
        int i;
    
        //申请TLS索引 
        if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
            ErrorExit(L"TlsAlloc failed");
    
    
        for (i = 0; i < THREADCOUNT; i++)
        {
            hThread[i] = CreateThread(NULL, 
                0,                           
                (LPTHREAD_START_ROUTINE)ThreadFunc, 
                NULL,                    
                0,                       
                &IDThread);              
    
            if (hThread[i] == NULL)
                ErrorExit(L"CreateThread error\n");
        }
    
        for (i = 0; i < THREADCOUNT; i++)
            WaitForSingleObject(hThread[i], INFINITE);
    
        TlsFree(dwTlsIndex);
    
        return 0;
    }
    

      

  • 相关阅读:
    gulp-API介绍
    前端构建工具gulpjs的使用介绍及技巧(转载)
    atom插件之less-autocompile
    atom-安装插件
    gulp入门1
    edp 基于node.js和npm的前端开发平台
    (转)详解JavaScript模块化开发
    require.js
    thinkcmf5 iis+php重写配置
    thinkcmf5 模板版变量的加载过程 和 新增网站配置项怎么全局使用
  • 原文地址:https://www.cnblogs.com/chunyou128/p/15899442.html
Copyright © 2020-2023  润新知