博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程局部存储 Thread Local Storage
阅读量:3986 次
发布时间:2019-05-24

本文共 1643 字,大约阅读时间需要 5 分钟。

  1 由于多个线程使用同一个变量,各个线程

    都对变量进行操作,那么变量的值会被不同
    线程操作覆盖。
         
      通常   变量A   <-- 线程A
                     <-- 线程B
                 
      TLS    变量A   <-- 线程A
             变量A   <-- 线程B
             

   2解决办法

     2.1 使用关键字 __declspec(thread)

(声明该变量后,线程访问时自动创建变量副本,
每个线程操作(读或写)自己的副本,无法操作实际变量)
        __declspec(thread) CHAR * g_pszText2 = NULL;

     2.2 TLS相关API()

(线程写入变量值之后,手动创建一个私有变量副本,可以对副本读取,但是不可以写入)

       2.2.1 创建TLS索引

         DWORD TlsAlloc(VOID)
         返回一个TLS索引号

       2.2.2 设置值

         BOOL TlsSetValue(
         DWORD dwTlsIndex, //TLS索引
         LPVOID lpTlsValue //保存的值
         );

       2.2.3 获取值

         LPVOID TlsGetValue(
          DWORD dwTlsIndex  //TLS索引
         );
         返回存放在索引内的值

       2.2.4 释放

         BOOL TlsFree(
          DWORD dwTlsIndex   //TLS索引

         );

示例代码说明:两个线程向同一个索引中设置不同值,然后再从同一个索引中可以取出自己设置的值,说明TLS索引对每个线程做了不同的备份

// ThreadTls.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdlib.h"#include "windows.h"CHAR * g_pszText   = NULL;DWORD  g_nTlsIndex = 0;void Print( ){	printf( "g_pszText: %s\n", g_pszText );	//从TLS索引中获取值	CHAR * pszText = (CHAR *)		TlsGetValue( g_nTlsIndex );	printf( "TLS: %s\n", pszText );}DWORD WINAPI PrintProc( LPVOID pParam ){	CHAR * pszText = (CHAR *)pParam;	g_pszText = (CHAR *)malloc( 100 );	strcpy( g_pszText, pszText );	//将值保存到TLS索引当中	TlsSetValue( g_nTlsIndex, g_pszText );	while( 1 )	{		Print( );		Sleep( 1000 );	}	return 0;}void Create( ){	HANDLE hThread   = NULL;	DWORD  nThreadID = 0;	CHAR szText1[] = "ThreadProc 1----------";	hThread = CreateThread( NULL, 0,		PrintProc, szText1, 0, &nThreadID );	CHAR szText2[] = "-----ThreadProc 2-----";	hThread = CreateThread( NULL, 0,		PrintProc, szText2, 0, &nThreadID );	WaitForSingleObject( hThread, INFINITE );}int main(int argc, char* argv[]){	//创建TLS索引号	g_nTlsIndex = TlsAlloc( );	//创建线程	Create( );	//释放索引	TlsFree( g_nTlsIndex );	return 0;}

转载地址:http://twxui.baihongyu.com/

你可能感兴趣的文章
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
idea讲web项目部署到tomcat,热部署
查看>>
centos 防火墙关闭/开启
查看>>
HASHMAP 深入解析
查看>>
HASHMAP原理解析,不错的文章
查看>>
优化IDEA启动速度,快了好多。后面有什么优化点,会继续往里面添加
查看>>
CSRF攻击与防御(写得非常好)
查看>>
SpringBoot 在CentOS7部署,注册为服务,开机启动
查看>>
Spring boot 学习
查看>>
JMeter 保持sessionId
查看>>
IDEA Properties中文unicode转码问题
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>