TLS 俩种基本用法
1静态
主意: 动态加载的DLL中TLS静态不会被初始化...........

//
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 ;