现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

vc中线程的本地存储

2014-03-12 05:50 工业·编程 ⁄ 共 1993字 ⁄ 字号 暂无评论
文章目录

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

给我留言

留言无头像?