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;
复制代码

 

 

 

posted @   谭志宇  阅读(999)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示