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;