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

线程本地存储概述

2013-02-17 11:53 工业·编程 ⁄ 共 1573字 ⁄ 字号 暂无评论

/******************************************************/
//一个程序作为一个进程来运行的时候
 
//里面可能会有几个线程在同时工作
 
//普通的全局变量在一个进程内唯一
    
//所有线程看到的是同一个值
     
//使用__declspec(thread)方式声明的全局变量就不是这样
       
//它对于一个线程是唯一的
         
//不同的线程都可以访问 但是是各自访问各自的 不会冲突
           
//当然也可以使用Tls...系列的函数来完成线程局部存储
             
//效果是一样的
       
/******************************************************/
#include <iostream>
#include <windows.h>
using namespace std;

//int gt_nData = 0;
_declspec(thread) int gt_nData = 0; //差别就在这
CRITICAL_SECTION g_cs;

DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
    while(true)
    {
        EnterCriticalSection(&g_cs);
       
        if(gt_nData < 100)
        {
            gt_nData += 1;
            cout<<"Thread1 :      "<<gt_nData<<endl;
        }
       
        LeaveCriticalSection(&g_cs);
    }
   
    return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
    while(true)
    {
        EnterCriticalSection(&g_cs);
       
        if(gt_nData < 100)
        {
            gt_nData += 5;
            cout<<"Thread2 : "<<gt_nData<<endl;
        }
       
        LeaveCriticalSection(&g_cs);
    }
   
    return 0;
}

void main(int argc,TCHAR*argv[])
{
    InitializeCriticalSection(&g_cs);

    HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc1,NULL,0,NULL);
    HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc2,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);

    Sleep(2000);

    DeleteCriticalSection(&g_cs);
}

线程本地存储区 (TLS) 是依据给定进程中的每个线程都被给予要在其中存储线程特定的数据位置的方法。
Tls 存在四种功能: TlsAlloc()、 TlsGetValue() 和 TlsSetValue(),TlsFree()。这些函数来操作 TLS 索引,进程中的每个线程的存储区,请参阅。给定的索引是仅在分配它的过程中有效。
请注意 Visual C++ 编译器支持的替代语法:

_declspec (线程)

它可以代替直接调用这些 Api。

继续阅读。。。

给我留言

留言无头像?