`
deepfuture
  • 浏览: 4424027 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80254
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70671
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103851
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:287078
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15097
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:68122
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32429
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46191
社区版块
存档分类
最新评论

VB.NET并行与分布式编程(3)-线程局部存储TLS[1]

 
阅读更多

一、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开发者设计的教程,主要涵盖了如何使用VB.NET进行网络通信和开发Web应用程序的关键技术。本指南通过一系列的htm格式文档,以图文并茂的方式阐述了网络编程的核心概念和实战...

    vb.net实现tcp通讯

    总之,VB.NET实现TCP通讯涉及了.NET Framework的网络编程接口,包括Socket和TcpListener类的使用,数据的发送与接收,以及可能的多线程和安全处理。通过实践和学习,你可以掌握创建可靠、高效的TCP应用程序的技能。

    P2P的简单示例(VB.net版)

    2. **多线程**:P2P网络通常需要同时处理多个连接,因此,多线程编程是必要的。VB.NET支持多线程,可以使用Thread类或ThreadPool类来实现。 3. **数据交换格式**:为了在网络间交换信息,需要一种数据交换格式,如...

    vb.net 网络 视频 聊天室 源码

    1. **VB.NET编程语言**: VB.NET是微软.NET框架的一部分,是一种面向对象的编程语言,具有简洁的语法和强大的功能。在本项目中,VB.NET被用来编写控制台应用程序、图形用户界面(GUI)以及与网络相关的功能。 2. **...

    NET分布式编程(C#).pdf

    .NET分布式编程是构建大型、可扩展的网络应用的关键技术,C#作为.NET框架的主要编程语言,为开发者提供了丰富的工具和库来实现这一目标。本资料《NET分布式编程(C#).pdf》全面涵盖了这一主题,旨在帮助读者深入理解...

    VB.NET网络通信实战

    在VB.NET中进行网络通信是开发跨平台应用和构建分布式系统的关键技能。"VB.NET网络通信实战"这本书籍深入探讨了如何使用VB.NET语言来实现网络功能,特别是着重讲解了SCOKET编程技术。SCOKET编程是网络通信的基础,它...

    VB.NET P2P

    在本文中,我们将深入探讨VB.NET编程语言如何与P2P网络技术相结合,构建高效、可靠且可扩展的网络应用。 点对点网络是一种分布式网络架构,其中每个参与者(节点)既是服务的提供者也是服务的消费者。这种模式在...

    vb.net网络编程

    在VB.NET中进行网络编程是开发跨平台应用程序和网络服务的关键技能。VB.NET提供了一整套丰富的类库,使得开发者可以轻松地实现客户端和服务器之间的通信。这些类库主要集中在System.Net命名空间下,它包含了处理HTTP...

    VB.NET网络编程指南

    在VB.NET中进行网络编程是开发跨平台应用程序和网络服务的关键技能。VB.NET(Visual Basic .NET)是Microsoft .NET框架的一部分,它提供了一系列强大的工具和类库,使得开发者能够轻松地创建网络应用。本指南将深入...

    vb.net即时通讯

    在VB.NET中构建一个类似QQ的即时通讯软件是一项复杂但有趣的任务,涉及到多个技术领域,包括网络编程、多线程处理、数据存储和用户界面设计等。VB.NET是微软的面向对象的编程语言,它提供了丰富的类库和工具,使得...

    vb.net打造自己的QQ

    1. **VB.NET基础**:了解VB.NET的基础语法,如变量声明、控制结构(条件语句、循环)、函数、类等,这是构建任何应用程序的基础。 2. **Windows Forms**:VB.NET中的Windows Forms用于创建桌面应用程序的用户界面,...

    VB.net网络编程

    ### VB.NET中的Socket异步编程知识点 #### 一、Socket编程概述 - **定义**:Socket编程是一种在不同计算机之间进行通信的方式。它基于TCP/IP协议族,允许开发者创建能够跨网络交换数据的应用程序。 - **特点**: ...

    VB.NET网络编程指南_程序设计.zip

    VB.NET是一种基于.NET Framework的编程语言,由微软公司开发,用于构建Windows应用程序、Web应用程序以及分布式系统。在VB.NET中进行网络编程,可以利用丰富的类库来实现客户端和服务器之间的通信,例如HTTP、FTP、...

    vb.net-Email-.zip_vb .net email_vb.net_vb.net 发邮件_发邮件

    在VB.NET编程环境中,发送电子邮件是一项常见的任务,尤其在企业级应用中,如自动化报告、通知服务等。本文将深入探讨使用VB.NET实现邮件发送,包括携带附件的功能。 首先,VB.NET利用System.Net.Mail命名空间中的...

    [VB.NET源码]发送邮件的示例代码

    标题中的 "[VB.NET源码]发送邮件的示例代码" 提示我们,这是一个关于使用VB.NET编程语言编写发送电子邮件的代码示例。VB.NET是Microsoft .NET框架的一部分,用于开发Windows应用程序和其他网络服务。在.NET环境中,...

    vb.net socket编程的QQ代码.rar

    在VB.NET中,Socket编程是一种基础且强大的网络通信技术,它允许程序通过网络发送和接收数据。QQ作为一款流行的即时通讯软件,其背后的通信机制也涉及到Socket编程。本压缩包中的"vb.net socket编程的QQ代码"可能...

    VB.net ClientServer

    3. **VB.NET中的网络编程类库** - **System.Net.Sockets**:提供对TCP和UDP协议的支持,包括TcpClient、TcpListener、UdpClient和UdpServer等类。 - **System.Net命名空间**:包含HTTP和FTP等Web通信相关的类。 4...

Global site tag (gtag.js) - Google Analytics