900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > vb.net-多线程并行计算(2)

vb.net-多线程并行计算(2)

时间:2019-09-02 03:13:08

相关推荐

vb.net-多线程并行计算(2)

一、TLS种类

1)动态TLS

2)静态TLS

静态TLS的速度比动态TLS快,在编译期就决定,需要定义一个静态域来表示TLS数据,编译器有足够的信息来在编译期间内发射代码,动态TLS需要通过一个或多个函数调用来获得地址。

二、静态TLS

我们可以在线程函数中使用static声明一个静态的变量,这个变量会被所有使用这个函数的线程共享。比如,我们写一个简单的计算:

200-1-2-…-20

其中减法部分有3个线程来完成,则意味着3个线程要共享一个临时的计算结果

Imports SystemImports System.ThreadingModule Module1Sub Main()Dim mythread1 As ThreadDim mythread2 As ThreadDim 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 SubPublic Sub mythreadrun(ByVal data As Object)Dim mynum As IntegerStatic jg As Integer = 200Dim temp As IntegerTryFor mynum = 1 To 20temp = jgjg -= mynumConsole.WriteLine(data & ":" & Now.ToLongTimeString & "=>" & temp & "-" & mynum & ",计算结果为:" & jg)Thread.Sleep(1)NextCatchConsole.WriteLine(data & ":" & Now.ToLongTimeString & "线程异常终止!")'终止线程Thread.CurrentThread.Abort()End TryEnd SubEnd ModuleDim mynum As IntegerStatic jg As Integer = 200Dim temp As IntegerTryFor mynum = 1 To 20temp = jgjg -= mynumConsole.WriteLine(data & ":" & Now.ToLongTimeString & "=>" & temp & "-" & mynum & ",计算结果为:" & jg)Thread.Sleep(1)Next

jg就是一个静态域,被多个线程共享

运行结果如下

[点击并拖拽以移动]

我们使用静态TLS功能,让jg成为一个线程本地变量,对每个线程而言,都是

在操作这个变量的副本

在某些多线程方案中,可能要为每个线程提供它自己的私有数据。 此类数据称为“线程本地数据”。 在 .NET Framework 3.5 和更低版本中,可以将 ThreadStatic 特性应用于静态变量以使其成为线程本地变量。 但是,使用 ThreadStatic 特性会导致细小的错误。 例如,即使基本的初始化语句也将导致该变量只在访问它的第一个线程上进行初始化,如以下示例中所示:

_

Shared counter As Integer

比如:

Imports SystemImports System.ThreadingClass Test<MTAThread> _Shared Sub Main()For i As Integer = 1 To 3Dim newThread As New Thread(AddressOf ThreadData.ThreadStaticDemo)newThread.Start()Next iEnd SubEnd ClassClass ThreadData<ThreadStaticAttribute> _Shared threadSpecificData As IntegerShared 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 SubEnd 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也就是说 中,使用替代方案:

,可以使用 System.Threading.ThreadLocal(Of T) 类型创建基于实例的线程本地变量,此变量可通过您提供的 Action(Of T) 委托在所有线程上进行初始化。

Imports SystemImports System.ThreadingModule Module1Sub Main()Dim mythread1 As ThreadDim mythread2 As ThreadDim 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 SubPublic Sub mythreadrun(ByVal data As Object)Dim mynum As IntegerDim jg As ThreadLocal(Of Integer) = New ThreadLocal(Of Integer)(Function() 50)TryFor mynum = 1 To 5jg.Value -= mynumConsole.WriteLine(data & " " & Now.ToLongTimeString & "=>" & (jg.Value + mynum) & "-" & mynum & ",计算结果为:" & jg.Value)Thread.Sleep(2)NextCatchConsole.WriteLine(data & " " & Now.ToLongTimeString & "线程异常终止!")'终止线程Thread.CurrentThread.Abort()End TryEnd SubEnd Module

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。