您的位置:首页 > 其它

vc中线程的本地存储

2012-11-28 22:30 330 查看
// ThreadTls.cpp : Defines the entry point for the console application.
//线程的本地存储(TLS)
/*
TLS的作用
当多个线程使用同一个全局或者静态变量的时候
由于各个线程会各自对该变量赋值操作,那么数据会被
不同的线程覆盖,即这些变量对于线程只有一个副本。
为了各自线程保存各自的数据,所以引入了TLS,一旦使用了
TlS,变量会对各个线程产生不同的副本,各个线程内就可以使用这些
变量保存自己的数据。

TLS的使用:
1 使用定义方式:__declspec(thread)
__declspec(thread)CHAR * g_pszText = NULL;

2 TLS系列的函数
1 分配一个TLS的索引     DWORD TlsAlloc(void);
2 将数据保存到一个索引  BOOL TlsSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue);
3 从一个索引得到一个值  LPVOID TlsGetValue(DWORD dwTlsIndex);
4 释放一个索引		  BOOL TlsFree(DWORD dwTlsIndex);

*/

#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include "stdlib.h"

//使用线程定义变量
__declspec(thread) CHAR * g_pszText2 = NULL;

CHAR * g_pszText1 = NULL;

//定义索引值
DWORD g_dwTlsIndex = 0;

void print()
{
//输出值
//	printf( "%s\r\n",g_pszText1 );
//	printf( "%s\r\n",g_pszText2 );
//从Tls中获取地址
CHAR * pszText3 = ( CHAR * )TlsGetValue( g_dwTlsIndex );
printf( "Tls g_pszText3 = %s\r\n",pszText3 );
}

DWORD WINAPI ThreadProc1( LPVOID pData )
{
//全局变量赋值
g_pszText1 = ( char * )malloc( 100 );
strcpy( g_pszText1,(char * )pData );
g_pszText2 = ( char * )malloc( 100 );
strcpy( g_pszText2,(char * )pData );

CHAR * pszText3 = (char * )malloc( 100 );
strcpy( pszText3,( char * )pData );
//将分配的内存保存到全局索引中
g_dwTlsIndex = (DWORD)pszText3;
//将分配的内存保存到
TlsSetValue( g_dwTlsIndex,pszText3 );

while(1)
{
print( );
Sleep( 2000 );
}

return 0;
}

void Tls()
{
//获取TLS的索引值
g_dwTlsIndex = TlsAlloc();
//创建线程1
char szText1[] = "Hello ThreadProc1";
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread( NULL,
0, ThreadProc1, szText1, 0, &dwThreadID );

//创建线程2
char szText2[] = "Hello ThreadProc2";
hThread = CreateThread( NULL,
0, ThreadProc1, szText2, 0, &dwThreadID );

//创建线程3
char szText3[] = "Hello ThreadProc3";
hThread = CreateThread( NULL,
0, ThreadProc1, szText3, 0, &dwThreadID );

WaitForSingleObject( hThread, INFINITE );

//释放索引
TlsFree( g_dwTlsIndex );
}

int main(int argc, char* argv[])
{
Tls();

getch();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: