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;
}
//
#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;
}
//
#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(nil, 0, @NewThread, nil, 0, ThreadId);
if H > 0 then
begin
WaitForSingleObject(H, INFINITE);
Memo1.Lines.Add('主线程TLS值' + IntToStr(DWord(TlsGetValue(GTlsIndex))));
end;
// 不使用时应该释放TLS时隙
TlsFree ( GTlsIndex );
end;
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(nil, 0, @NewThread, nil, 0, ThreadId);
if H > 0 then
begin
WaitForSingleObject(H, INFINITE);
Memo1.Lines.Add('主线程TLS值' + IntToStr(DWord(TlsGetValue(GTlsIndex))));
end;
// 不使用时应该释放TLS时隙
TlsFree ( GTlsIndex );
end;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 让容器管理更轻松!