VB.NET并行与分布式编程(3)-线程局部存储TLS[1]
一、TLS种类
1)动态TLS
2)静态TLS
静态TLS的速度比动态TLS快,在编译期就决定,需要定义一个静态域来表示TLS数据,编译器有足够的信息来在编译期间内发射代码,动态TLS需要通过一个或多个函数调用来获得地址。
二、静态TLS
我们可以在线程函数中使用static声明一个静态的变量,这个变量会被所有使用这个函数的线程共享。比如,我们写一个简单的计算:
?200-1-2-....-20
其中减法部分有3个线程来完成,则意味着3个线程要共享一个临时的计算结果
?
?
????????? Dim mynum As Integer
??????? Static jg As Integer = 200
??????? Dim temp As Integer
??????? Try
??????????? For mynum = 1 To 20
??????????????? temp = jg
??????????????? jg -= mynum
??????????????? Console.WriteLine(data & ":" & Now.ToLongTimeString & "=>" & temp & "-" & mynum & ",计算结果为:" & jg)
??????????????? Thread.Sleep(1)
??????????? Next?
jg就是一个静态域,被多个线程共享
运行结果如下
??
我们使用静态TLS功能,让jg成为一个线程本地变量,对每个线程而言,都是
在操作这个变量的副本
?
在某些多线程方案中,可能要为每个线程提供它自己的私有数据。?此类数据称为“线程本地数据”。?在?.NET?Framework?3.5?和更低版本中,可以将?ThreadStatic?特性应用于静态变量以使其成为线程本地变量。?但是,使用?ThreadStatic?特性会导致细小的错误。?例如,即使基本的初始化语句也将导致该变量只在访问它的第一个线程上进行初始化,如以下示例中所示:?<ThreadStaticAttribute> _
Shared counter As Integer比如:
?
?
?