.Net中的TLS(线程局部存储)

原创 2006年05月31日 22:59:00
一些编译器(如VC++中的CL)支持所谓“TLS(Thread Local Storage)”的特性,它的意思是让静态变量的唯一性只作用于线程内,在一个类中声明的一个静态变量对于两个线程来说是两个变量,如:
__declspec(thread) static int a;
.Net下也支持TLS,它是通过变量属性的方式来声明的。例如,下面的代码:
 
using System;
using System.Threading;
class c1
{
 [ThreadStatic]
 public static int A = 0;  //TLS变量
}
class Class1
{
 static void Main(string[] args)
 {
  c1.A = 1;
  new Thread(new ThreadStart(ThreadProc)).Start();
  Console.WriteLine("In main thread, c1.A={0}", c1.A);
  Console.ReadLine();
 }
 static void ThreadProc()
 {
  Console.WriteLine("In sub thread, c1.A={0}", c1.A);
 }
}
 
虽然c1类中A是静态成员,但是由于有属性ThreadStart存在,使得它成为一个TLS变量。程序的主线程对其的值作了修改,但这个修改对子线程是无效的,后面使用两个线程分别来输出此变量的值,得到的结果如下:
 
In main thread, c1.A=1
In sub thread, c1.A=0
 
这个特性还是比较有用的。目前想到的一个用处是,当多个线程访问数据库时,如果每次访问都new一个Connection并不是个好办法;同一个线程内的访问显然不会有并发冲突,而如果让多线程共享同一个Connection对象,当线程1调用了Connection.Open()后线程2又调用了此方法,那么就会出现异常。此时可以把Connection对象作为一个类的静态TLS成员,保证每个线程使用的是不同的Connection实例。
需要说明的是,如果TLS作用于引用类型上,每个程在使用前都需要进行初始化,否则其值是null。

.Net 与TLS版本的兼容性

.NET 在支持 TLS 1.1 或 TLS 1.2 操作系统中运行时,兼容最新版本.NET 4.6 和更高版本 兼容 TLS 1.1 或更高版本(默认设置)。.NET 4.5 至 4.5.2 ...
  • xiaofeizai1116
  • xiaofeizai1116
  • 2016年08月26日 16:28
  • 152

.net2.0用TLS1.2+TCP Stream访问https网站

背景 在用HttpWebRequest访问一个https的网站时,程序在执行到下面这一句代码时会出异常: HttpWebResponse response = capRequest.GetRespon...
  • atceedsun
  • atceedsun
  • 2015年12月31日 21:15
  • 5557

线程局部存储(TLS)

线程局部存储,Part 1:概述 线程局部存储,Part 2:显式TLS 线程局部存储,Part 3:编译器和链接器对隐式TLS的支持 线程局部存储,Part 4:访问__declspec(th...
  • whatday
  • whatday
  • 2013年04月10日 10:57
  • 6022

C++线程局部存储(TLS)

基本类型(如(unsigned) int,long, char,指针,c类型的结构体等 )可以采用用 __thread修饰符来定义线程局部变量. 示例如下: __thread int i; e...
  • zhangjun03402
  • zhangjun03402
  • 2015年10月16日 12:32
  • 1519

聊聊Linux中的线程本地存储(1)——什么是TLS

什么是线程本地存储(TLS,Thread Local Storage)呢?相信你看过很多次这个定义,但它表达的内涵是什么呢?本文从变量模型出发,讨论引入多线程编程模式之后,需要重新修改变量模型,从而引...
  • linyt
  • linyt
  • 2016年07月17日 15:22
  • 4990

每天进步一点点——Linux中的线程局部存储(一)

在Linux系统中使用C/C++进行多线程编程时有些数据无需使用锁即可做到快速高效,本文从线程局部存储出发讨论如何高效的实现无锁编程。...
  • cywosp
  • cywosp
  • 2014年05月21日 14:25
  • 19872

关于Linux线程的线程栈以及TLS

说明: a.本文描述Linux NPTL的线程栈简要实现以及线程本地存储的原理,实验环境中Linux内核版本为2.6.32,glibc版本是2.12.1,Linux发行版为ubuntu,硬件平台为x...
  • 21cnbao
  • 21cnbao
  • 2014年03月23日 22:52
  • 8708

线程局部存储tls的使用

线程局部存储(Thread Local Storage,TLS)主要用于在多线程中,存储和维护一些线程相关的数据,存储的数据会被关联到当前线程中去,并不需要锁来维护。。因此也没有多线程间资源竞争问题,...
  • waruqi
  • waruqi
  • 2016年11月17日 16:04
  • 473

每天进步一点点——Linux中的线程局部存储(二)

Linux C/C++多线程编程中请善用__thread
  • cywosp
  • cywosp
  • 2014年05月24日 22:51
  • 6525

[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)-win32线程和pthread线程比较]

场景: 1. 需要统计某个线程的对象上创建的个数. 2. 当创建的堆空间需要根据线程需要创建和结束时销毁时. 3. 因为范围是线程只能看到自己的存储数据,所以不需要临界区或互斥量来维护自己的堆内存....
  • infoworld
  • infoworld
  • 2015年02月28日 23:18
  • 2606
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.Net中的TLS(线程局部存储)
举报原因:
原因补充:

(最多只允许输入30个字)