接上节,我们可以使用下面语句创建一个线程本地变量,利用静态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
Imports System
Imports System.Threading
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
'创建线程对象
mythread1 = New Thread(AddressOf mythreadrun)
mythread2 = New Thread(AddressOf mythreadrun)
mythread3 = New Thread(AddressOf mythreadrun)
Console.WriteLine(Now.ToLongTimeString & "线程对象创建完毕,开始执行线程")
'执行线程
mythread1.Start("线程1")
mythread2.Start("线程2")
mythread3.Start("线程3")
'等待线程完成
mythread1.Join()
mythread2.Join()
mythread3.Join()
'线程执行完毕
Console.WriteLine(Now.ToLongTimeString & "线程执行完毕!")
End Sub
Public Sub mythreadrun(ByVal data As Object)
Dim mynum As Integer
'分配一个新的槽,这个槽存放线程本地数据,槽名称
'必须唯一
Thread.AllocateNamedDataSlot(data)
Dim jg As LocalDataStoreSlot
jg = Thread.GetNamedDataSlot(data)
Thread.SetData(jg, 100)
Try
For mynum = 1 To 10
Thread.SetData(jg, Thread.GetData(jg) - mynum)
Console.WriteLine(data & " " & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",计算结果为:" & Thread.GetData(jg))
Thread.Sleep(2)
Next
Catch
Console.WriteLine(data & " " & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
Finally
Thread.FreeNamedDataSlot(data)
End Try
End Sub
End Module
运行结果如我们所愿,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可写、读槽中数据
四、数据槽的值在线程或上下文对象之间不共享
LocalDataStoreSlot 结构可用作本地存储内存机制,线程和上下文可以使用此机制分别存储线程特定的数据和上下文特定的数据。 公共语言运行时在创建每个进程时给它分配一个多槽数据存储区数组。 线程或上下文调用各种函数在数据存储区中分配数据槽、在槽内存储和检索数据值、以及释放数据槽以便在线程或上下文过期后重新使用它。
对于每个线程或上下文,数据槽都是唯一的;它们的值在线程或上下文对象之间不共享。 数据槽可根据名称或根据索引号来分配。
我们可以从下面程序看出
Imports System
Imports System.Threading
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
Dim jg As LocalDataStoreSlot
'创建线程对象
mythread1 = New Thread(AddressOf mythreadrun)
mythread2 = New Thread(AddressOf mythreadrun)
mythread3 = New Thread(AddressOf mythreadrun)
Console.WriteLine(Now.ToLongTimeString & "线程对象创建完毕,开始执行线程")
'jg = Thread.AllocateNamedDataSlot("myjg")
' Thread.SetData(jg, 100)
'执行线程
mythread1.Start("线程1")
mythread2.Start("线程2")
mythread3.Start("线程3")
'等待线程完成
mythread1.Join()
mythread2.Join()
mythread3.Join()
'线程执行完毕
Console.WriteLine(Now.ToLongTimeString & "线程执行完毕!")
Thread.FreeNamedDataSlot("myjg")
End Sub
Public Sub mythreadrun(ByVal data As Object)
Dim randomGenerator As New Random()
Dim mynum As Integer
'分配一个新的槽,这个槽存放线程本地数据,槽名称为
'myjg
Dim jg As LocalDataStoreSlot
Try
jg = Thread.AllocateNamedDataSlot("myjg")
Catch
jg = Thread.GetNamedDataSlot("myjg")
End Try
Thread.SetData(jg, 100)
Try
For mynum = 1 To 10
Thread.SetData(jg, Thread.GetData(jg) - mynum)
Console.WriteLine(data & " " & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",计算结果为:" & Thread.GetData(jg))
Thread.Sleep(randomGenerator.Next(10, 200))
Next
Catch
Console.WriteLine(data & " " & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
End Try
End Sub
End Module
- 大小: 71.4 KB
分享到:
相关推荐
windows线程局部存储TLS原理与解释
Windows Server 合规漏洞修复,修复Windows Server CVE-2016-2183 SSL/TLS协议信息泄露漏洞修复脚本,基于Windows PowerShell, 兼容Windows Server 2016/2019,防止Sweet32 生日攻击
《Windows PE权威指南》TLS学习代码 实现TLS表定位,枚举; 实现动态线程存储 实现静态线程存储 可与《PE文件:TLS线程局部存储》配套使用 https://blog.csdn.net/weixin_43742894/article/details/105235426
ELF Handling For Thread Local Storage
Mbed TLS is now maintained under open governance at TrustedFirmware.org. Head there for the latest information about the project. The information on this website will be retained while we migrate but ...
主要分析线程局部存储机制的实现,稍微底层了一点点
用SVD-TLS估计观测数据的ARMA模型的AR参数,
MI-ESPRIT算法的仿真程序,包含RLS-MI-ESPRIT算法和TLS-MI-ESPRIT算法
auto-dockerserver-tls.sh
使用python来解析加密数据包,可通过pycharm安装Scapy-ssl_tls库文件,但库文件经常会安装失败,因此需要考虑直接安装python对应版本的Scapy-ssl_tls库文件
本文实例讲述了C++采用TLS线程局部存储的用法。分享给大家供大家参考。 具体方法如下: 代码如下:// useTLS.cpp : 定义控制台应用程序的入口点。 // #include “stdafx.h” #include #include //...
基于Fabric1.4关于fabric-java-sdk实现tls访问,包括了对sdk调用的完整配置,不包含SDK本身。其中图片内容为crypto-config.yaml部分配置内容。其中SANS对应ChaincodeManager中115行的地址。
经典DOA估计算法-TLS-ESPRIT算法函数,附原始参考文献
现代谱估计,运用一组观测数据(随机过程)去估计该数据的功率谱
ARM公司,自家开源 mbedtls-2.16.3-apache.tgz 2020-3-21最新发布版本。 针对ARM 有很多汇编级别的优化配置,开源有维护定期升级,使用新版本替换文件即可。 VS2010 很多工程包,可以直接编译。 Linux 下自带...
3.用处:用于TLS-ESPRIT算法编程学习 4.指向人群:本科,硕士,博士等教研使用 5.运行注意事项: 使用matlab2021a或者更高版本测试,运行里面的Runme.m文件,不要直接运行子函数文件。运行时注意matlab左侧的当前...
根据张贤达版《现代信号处理》的SVD-TLS算法,基于奇异值分解的总体最小二乘法, SVD-TLS是一个在现代谱估计中一个基础的算法
官方的mbedtls库,2.16.0版本,移植教程可以去他们的github上面看,https://github.com/ARMmbed/mbedtls
第 1 章版本和修订初始版本更新证书添加方式,增加资源占用优化手册第 2 章软件包介绍mbedtls 软件包是 RT-Thread 基于 ARMmbed/mbe