VB.NET并行与分布式编程(3)-线程局部存储TLS[2]
接上节,我们可以使用下面语句创建一个线程本地变量,利用静态TLS功能
Dim betterCounter As ThreadLocal(Of Integer) = New ThreadLocal(Of Integer)(Function() 1)
betterCounter的值初始化为1。在本程序中,jg被初始化为50,并定义成线程本地变量
?
??????? Dim jg As ThreadLocal(Of Integer) = New ThreadLocal(Of Integer)(Function() 50)
?
然后,我们使用jg.Value?来读写这个本地变量的值
?jg.Value -= mynum
?
三、动态TLS
?
?
运行结果如我们所愿,jg变量通过动态TLS提供的槽机制实现了线程本地变量
?
?
???????? '分配一个新的槽,这个槽存放线程本地数据,槽名称为
??????? 'myjg,名称必须唯一
??????? Thread.AllocateNamedDataSlot(data)
??????? Dim jg As LocalDataStoreSlot
??????? jg = Thread.GetNamedDataSlot(data)
??????? Thread.SetData(jg, 100)
以上代码是关健,我们使用命名数据槽,当然,我们也可以使用未命名槽,因为未命名数据槽相对较简单,所以这里使用了命名数据槽,向大家演示一下其功能。注意:
如果使用 AllocateNamedDataSlot 方法已分配已经存在的指定名称的槽,此方法会引发异常,且无法测试是否已分配某个槽。另外,使用此方法分配的数据槽必须使用 FreeNamedDataSlot 来释放。
?
?
本例中,我们分配槽使用下面语句
Thread.AllocateNamedDataSlot(data)
获取某个命名槽的引用,以便进行下一步操作
jg = Thread.GetNamedDataSlot(data)
?
Thread.SetData和Thread.GetData可写、读槽中数据
四、数据槽的值在线程或上下文对象之间不共享
?