vc中线程的本地存储

22 篇文章 0 订阅
13 篇文章 1 订阅
// 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值