博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net中的TLS(线程局部存储)
阅读量:4124 次
发布时间:2019-05-25

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

一些编译器(如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。

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

你可能感兴趣的文章
Android自动关机代码
查看>>
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>
iWatch报错: Authorization request cancled
查看>>
iWatch报错: Authorizationsession time out
查看>>
如何运行从网上下载的iWatch项目详细步骤.
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>
X-code beta 开发iWatch项目,运行没有错误,但是某些操作一点就崩,而且找不错误的原因场景一
查看>>
Xcode 报错: Extra argument in call
查看>>
iTunes Connect 上传APP报错: Communication error. please use diagnostic mode to check connectivity.
查看>>
#import <Cocoa/Cocoa.h> 报错 Lexical or Preprocessor Issue 'Cocoa/Cocoa.h' file not found
查看>>
`MQTTClient (~> 0.2.6)` required by `Podfile`
查看>>
X-Code 报错 ld: library not found for -lAFNetworking
查看>>
Bitcode
查看>>
If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
How to access the keys in dictionary in object-c
查看>>