一、TLS种类
1)动态TLS
2)静态TLS
静态TLS的速度比动态TLS快,在编译期就决定,需要定义一个静态域来表示TLS数据,编译器有足够的信息来在编译期间内发射代码,动态TLS需要通过一个或多个函数调用来获得地址。
二、静态TLS
我们可以在线程函数中使用static声明一个静态的变量,这个变量会被所有使用这个函数的线程共享。比如,我们写一个简单的计算:
200-1-2-....-20
其中减法部分有3个线程来完成,则意味着3个线程要共享一个临时的计算结果
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
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
Catch
Console.WriteLine(data & ":" & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
End Try
End Sub
End Module
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
比如:
Imports System
Imports System.Threading
Class Test
<MTAThread> _
Shared Sub Main()
For i As Integer = 1 To 3
Dim newThread As New Thread(AddressOf ThreadData.ThreadStaticDemo)
newThread.Start()
Next i
End Sub
End Class
Class ThreadData
<ThreadStaticAttribute> _
Shared threadSpecificData As Integer
Shared Sub ThreadStaticDemo()
' Store the managed thread id for each thread in the static
' variable.
threadSpecificData = Thread.CurrentThread.ManagedThreadId
' Allow other threads time to execute the same code, to show
' that the static data is unique to each thread.
Thread.Sleep( 1000 )
' Display the static data.
Console.WriteLine( "Data for managed thread {0}: {1}", _
Thread.CurrentThread.ManagedThreadId, threadSpecificData )
End Sub
End Class
' This code example produces output similar to the following:
'
'Data for managed thread 4: 4
'Data for managed thread 5: 5
'Data for managed thread 3: 3
在所有其他线程上,该变量将通过使用默认值(零)来进行初始化。
我们在.net 4.0也就是说vb.net 2010中,使用替代方案:
,可以使用 System.Threading.ThreadLocal(Of T) 类型创建基于实例的线程本地变量,此变量可通过您提供的 Action(Of T) 委托在所有线程上进行初始化。
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
Dim jg As ThreadLocal(Of Integer) = New ThreadLocal(Of Integer)(Function() 50)
Try
For mynum = 1 To 5
jg.Value -= mynum
Console.WriteLine(data & " " & Now.ToLongTimeString & "=>" & (jg.Value + mynum) & "-" & mynum & ",计算结果为:" & jg.Value)
Thread.Sleep(2)
Next
Catch
Console.WriteLine(data & " " & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
End Try
End Sub
End Module
- 大小: 50.2 KB
- 大小: 72.9 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 ...
主要分析线程局部存储机制的实现,稍微底层了一点点
MI-ESPRIT算法的仿真程序,包含RLS-MI-ESPRIT算法和TLS-MI-ESPRIT算法
auto-dockerserver-tls.sh
用SVD-TLS估计观测数据的ARMA模型的AR参数,
本文实例讲述了C++采用TLS线程局部存储的用法。分享给大家供大家参考。 具体方法如下: 代码如下:// useTLS.cpp : 定义控制台应用程序的入口点。 // #include “stdafx.h” #include #include //...
基于Fabric1.4关于fabric-java-sdk实现tls访问,包括了对sdk调用的完整配置,不包含SDK本身。其中图片内容为crypto-config.yaml部分配置内容。其中SANS对应ChaincodeManager中115行的地址。
使用python来解析加密数据包,可通过pycharm安装Scapy-ssl_tls库文件,但库文件经常会安装失败,因此需要考虑直接安装python对应版本的Scapy-ssl_tls库文件
经典DOA估计算法-TLS-ESPRIT算法函数,附原始参考文献
现代谱估计,运用一组观测数据(随机过程)去估计该数据的功率谱
第 1 章版本和修订初始版本更新证书添加方式,增加资源占用优化手册第 2 章软件包介绍mbedtls 软件包是 RT-Thread 基于 ARMmbed/mbe
3.用处:用于TLS-ESPRIT算法编程学习 4.指向人群:本科,硕士,博士等教研使用 5.运行注意事项: 使用matlab2021a或者更高版本测试,运行里面的Runme.m文件,不要直接运行子函数文件。运行时注意matlab左侧的当前...
根据张贤达版《现代信号处理》的SVD-TLS算法,基于奇异值分解的总体最小二乘法, SVD-TLS是一个在现代谱估计中一个基础的算法
官方的mbedtls库,2.16.0版本,移植教程可以去他们的github上面看,https://github.com/ARMmbed/mbedtls
certificate-transparency-go, 审核TLS证书,转到代码 证书透明度:转到代码 这个存储库保存了与证书透明 ( CT ) 相关的代码。 存储库要求版本 1.9.知识库结构Trillian CT在代码工作。重建生成的代码更新供应商代码...