• TLS 俩种基本用法


    1静态

    代码
    // TLS_Static.cpp : 定义控制台应用程序的入口点。
    //

    #include 
    "stdafx.h"

    #include 
    <Windows.h>
    #include 
    <iostream>
    using namespace std ;

    // 定义静态TLS全局变量
    __declspec(thread) int value = 0 ;

    DWORD WINAPI NewThread ( LPVOID lParam )
    {
        
    // 设置子线程value为10,并不影响主线程
        value = 10 ;
        
    // 取得子线程静态TLS的值
        cout << "子线程 value=" << value << endl ;
        
    return 0 ;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
        
    // 设置主线程静态TLS的value为5
        value = 5 ;
        
    // 创建子线程
        HANDLE hThread = CreateThread ( NULL, 0, NewThread, NULL, 0, NULL ) ;
        
    if ( hThread )
        {
            
    // 等待直到子线程结束
            WaitForSingleObject ( hThread, INFINITE ) ;
            
    // 取得主线程静态TLS的值
            cout << "主线程 value=" << value << endl ;
        }
        
    return 0;
    }

    2 动态

    代码
    // TLS_Dynamic.cpp : 定义控制台应用程序的入口点。
    //

    #include 
    "stdafx.h"


    #include 
    <windows.h>
    #include 
    <iostream>
    using namespace std ;

    // 全局变量保存TLS时隙索引值
    // 约定所有线程都使用TLS的这个时隙
    UINT    nTlsIndex = 0 ;

    DWORD WINAPI NewThread ( LPVOID lParam )
    {
        
    // 设置子线程TLS值
        TlsSetValue ( nTlsIndex, (LPVOID)10 ) ;
        
    // 取得子线程TLS值
        cout << "子线程" << nTlsIndex << "号TLS时隙值为" << (DWORD)TlsGetValue(nTlsIndex ) << endl ;
        
    return 0 ;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
        
    // 动态分配TLS时隙
        nTlsIndex = TlsAlloc () ;
        
    if ( nTlsIndex != TLS_OUT_OF_INDEXES )
        {
            cout 
    << "TLS时隙为" << nTlsIndex << endl ;

            
    // 主线程TLS指定时隙的值
            TlsSetValue ( nTlsIndex, (LPVOID)5 ) ;

            
    // 创建子线程
            HANDLE hThread = CreateThread ( NULL, 0, NewThread, NULL, 0, NULL ) ;
            
    if ( hThread )
            {
                
    // 等待子线程结束
                WaitForSingleObject ( hThread, INFINITE ) ;
                
    // 取得主线程TLS的值,观察是否被改变
                cout << "主线程" << nTlsIndex << "号TLS时隙值为" << (DWORD)TlsGetValue(nTlsIndex ) << endl ;
            }

            
    // 不使用时应该释放TLS时隙
            TlsFree ( nTlsIndex ) ;
        }
        
    else
        {
            cout 
    << "没有可用的TLS时隙!" << endl ;
        }

        cin.
    get () ;
        
    return 0;
    }

    3 DELPHI 中没找到替代静态TLS的方法

    代码
    var
      Form1: TForm1;
      GTlsIndex: UINT 
    = 0;

    implementation

    {$R *.dfm}

    function NewThread(lparam: Pointer): DWORD; stdcall;
    begin
      
    // 设置子线程TLS值
      TlsSetValue(GTlsIndex, Pointer(
    10));
      
    // 取得子线程TLS值
      MessageBox(
    0, PChar('子线程TLS值' + IntToStr(DWord(TlsGetValue(GTlsIndex)))), '', MB_OK );
      Result :
    = 0;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
      ThreadId: DWORD;
      h: THandle;
    begin
      
    // 动态分配TLS时隙
      GTlsIndex :
    = TlsAlloc();
      
    if GTlsIndex <> TLS_OUT_OF_INDEXES then
      
    begin
        Memo1.Lines.Add(
    'TLS: ' + IntToStr(GTlsIndex));
      
    end;

      
    // 主线程TLS指定时隙的值
      TlsSetValue(GTlsIndex, Pointer(
    5));

      H :
    = CreateThread(nil0, @NewThread, nil0, ThreadId);
      
    if H > 0 then
      
    begin
        WaitForSingleObject(H, INFINITE);
        Memo1.Lines.Add(
    '主线程TLS值' + IntToStr(DWord(TlsGetValue(GTlsIndex))));
      
    end;

      
    // 不使用时应该释放TLS时隙
      TlsFree ( GTlsIndex );
    end;
  • 相关阅读:
    parent和top
    history
    [矩阵快速幂]T-shirt(2018江苏邀请赛I题)
    [学习]Java学习
    [数论]Factors of Factorial
    [RMQ][ST算法]Frequent values
    [二维树状数组]计数问题
    [树状数组]Mishka and Interesting sum(codeforces703D)
    [简单思维题]Snuke's Coloring 2-1
    [树状数组][逆序数]Ultra-QuickSort
  • 原文地址:https://www.cnblogs.com/chengxin1982/p/1747761.html
Copyright © 2020-2023  润新知