一、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
分享到:
相关推荐
《VB.NET网络编程指南》是一本专为VB.NET开发者设计的教程,主要涵盖了如何使用VB.NET进行网络通信和开发Web应用程序的关键技术。本指南通过一系列的htm格式文档,以图文并茂的方式阐述了网络编程的核心概念和实战...
总之,VB.NET实现TCP通讯涉及了.NET Framework的网络编程接口,包括Socket和TcpListener类的使用,数据的发送与接收,以及可能的多线程和安全处理。通过实践和学习,你可以掌握创建可靠、高效的TCP应用程序的技能。
2. **多线程**:P2P网络通常需要同时处理多个连接,因此,多线程编程是必要的。VB.NET支持多线程,可以使用Thread类或ThreadPool类来实现。 3. **数据交换格式**:为了在网络间交换信息,需要一种数据交换格式,如...
1. **VB.NET编程语言**: VB.NET是微软.NET框架的一部分,是一种面向对象的编程语言,具有简洁的语法和强大的功能。在本项目中,VB.NET被用来编写控制台应用程序、图形用户界面(GUI)以及与网络相关的功能。 2. **...
.NET分布式编程是构建大型、可扩展的网络应用的关键技术,C#作为.NET框架的主要编程语言,为开发者提供了丰富的工具和库来实现这一目标。本资料《NET分布式编程(C#).pdf》全面涵盖了这一主题,旨在帮助读者深入理解...
在VB.NET中进行网络通信是开发跨平台应用和构建分布式系统的关键技能。"VB.NET网络通信实战"这本书籍深入探讨了如何使用VB.NET语言来实现网络功能,特别是着重讲解了SCOKET编程技术。SCOKET编程是网络通信的基础,它...
在本文中,我们将深入探讨VB.NET编程语言如何与P2P网络技术相结合,构建高效、可靠且可扩展的网络应用。 点对点网络是一种分布式网络架构,其中每个参与者(节点)既是服务的提供者也是服务的消费者。这种模式在...
在VB.NET中进行网络编程是开发跨平台应用程序和网络服务的关键技能。VB.NET提供了一整套丰富的类库,使得开发者可以轻松地实现客户端和服务器之间的通信。这些类库主要集中在System.Net命名空间下,它包含了处理HTTP...
在VB.NET中进行网络编程是开发跨平台应用程序和网络服务的关键技能。VB.NET(Visual Basic .NET)是Microsoft .NET框架的一部分,它提供了一系列强大的工具和类库,使得开发者能够轻松地创建网络应用。本指南将深入...
在VB.NET中构建一个类似QQ的即时通讯软件是一项复杂但有趣的任务,涉及到多个技术领域,包括网络编程、多线程处理、数据存储和用户界面设计等。VB.NET是微软的面向对象的编程语言,它提供了丰富的类库和工具,使得...
1. **VB.NET基础**:了解VB.NET的基础语法,如变量声明、控制结构(条件语句、循环)、函数、类等,这是构建任何应用程序的基础。 2. **Windows Forms**:VB.NET中的Windows Forms用于创建桌面应用程序的用户界面,...
### VB.NET中的Socket异步编程知识点 #### 一、Socket编程概述 - **定义**:Socket编程是一种在不同计算机之间进行通信的方式。它基于TCP/IP协议族,允许开发者创建能够跨网络交换数据的应用程序。 - **特点**: ...
VB.NET是一种基于.NET Framework的编程语言,由微软公司开发,用于构建Windows应用程序、Web应用程序以及分布式系统。在VB.NET中进行网络编程,可以利用丰富的类库来实现客户端和服务器之间的通信,例如HTTP、FTP、...
在VB.NET编程环境中,发送电子邮件是一项常见的任务,尤其在企业级应用中,如自动化报告、通知服务等。本文将深入探讨使用VB.NET实现邮件发送,包括携带附件的功能。 首先,VB.NET利用System.Net.Mail命名空间中的...
标题中的 "[VB.NET源码]发送邮件的示例代码" 提示我们,这是一个关于使用VB.NET编程语言编写发送电子邮件的代码示例。VB.NET是Microsoft .NET框架的一部分,用于开发Windows应用程序和其他网络服务。在.NET环境中,...
在VB.NET中,Socket编程是一种基础且强大的网络通信技术,它允许程序通过网络发送和接收数据。QQ作为一款流行的即时通讯软件,其背后的通信机制也涉及到Socket编程。本压缩包中的"vb.net socket编程的QQ代码"可能...
3. **VB.NET中的网络编程类库** - **System.Net.Sockets**:提供对TCP和UDP协议的支持,包括TcpClient、TcpListener、UdpClient和UdpServer等类。 - **System.Net命名空间**:包含HTTP和FTP等Web通信相关的类。 4...