-
VB.NET并行与分布式编程
收藏VB.NET并行与分布式编程
最近更新文章
VB.NET并行与分布式编程(6)-线程与内核同步[4]
我们下面通过WaitHandle.WaitOne 方法和EventWaitHandle.Set 方法来实现
EventWaitHandle.Set 方法
将事件状态设置为终止状态,允许一个或多个等待线程继续。
WaitHandle.WaitOne方法
阻止当前线程,直到当前 WaitHandle收到信号为止。
Imports System
Impor ...
VB.NET并行与分布式编程(6)-线程与内核同步[3]
一、 WaitHandle 类封装等待对共享资源的独占访问的操作系统特定的对象
1)WaitHandle 类型公开以下成员。
构造函数--------------------------------------------------------------------------------
名称 说明 WaitHandle 初始化 WaitHandle 类的新实例。 ...
VB.NET并行与分布式编程(6)-线程与内核同步[2]
那么我们通过关键区域可以解决这个问题吗
Thread.BeginCriticalRegion 通知宿主执行将要进入一个代码区域,在该代码区域内线程中止或未经处理的异常的影响可能会危害应用程序域中的其他任务。公共语言运行时 (CLR) 的宿主(如 Microsoft SQL Server 2005)可以对关键和非关键代码区域建立不同的失败策略。 关键区域是指线程中止或未经处理的异常的影响可能不限于当 ...
VB.NET并行与分布式编程(6)-线程与内核同步[1]
我们接着前面的例子讲述,这个例子的功能是3个线程共同完成对一个数的连续减法运算,在前面的例子,我们在每个线程做完减法运算后都加入了thread.sleep,以使线程能将执行机会给其它线程,同时也使得在这个例子一般不会发生线程同步问题,我们去掉sleep,可以发现由于没有解决同步问题,有线程读到了脏数据。
代码为:
Imports System
Imports System.Threadi ...
VB.NET并行与分布式编程(5)-线程状态与调整[4]
2)通过System.Diagnostics.ProcessThread来设置优先级,它能设置比第1种方法更多的优先级
Idle 指定空闲优先级。 它是所有线程的可能的最低优先级值,与关联的 ProcessPriorityClass 的值无关。 Lowest 指定最低优先级。 这比关联的 ProcessPriorityClass 的普通优先级低两级。 BelowNormal 指定的 ...
VB.NET并行与分布式编程(5)-线程状态与调整[3]
4、线程优先级
Imports System
Imports System.Threading
Imports System.Diagnostics
Imports System.Diagnostics.ThreadState
Module Module1
Sub Main()
Dim mythread1 As Th ...
VB.NET并行与分布式编程(5)-线程状态与调整[2]
Imports System
Imports System.Threading
Imports System.Diagnostics
Imports System.Diagnostics.ThreadState
Module Module1
Sub Main()
Dim mythread1 As Thread
...
VB.NET并行与分布式编程(5)-线程状态与调整[1]
一、线程状态涉及的CLR类
1)Process 类
提供对本地和远程进程的访问并使您能够启动和停止本地系统进程
GetCurrentProcess 获取新的 Process 组件并将 ...
VB.NET并行与分布式编程(4)-线程栈[4]
4、栈溢出 1)溢出情况 a)线程试图提交比保留大小更多的栈内存页 b)没有物理内存也没有虚拟内存可供提交更多的守护页 2、栈溢出后还想继续运行程序,必须重置守护页,可以使用CRT的_resetstkoflw。 不过对于大的数据,可以考虑将某些数据移到堆中。堆栈是有限的,甚至在用户模式下也是如此,如果无法提交堆栈页,会导致堆栈溢出异常。_resetstkoflw 函数可以将系统从堆栈溢出的情况恢复 ...
VB.NET并行与分布式编程(4)-线程栈[3]
3、运用stacktrace类实现线程栈回溯跟踪
代码如下:
Imports System
Imports System.Threading
Imports System.Diagnostics.StackTrace
Module Module1
Sub Main()
Dim main_x As Integer
main_x ...
VB.NET并行与分布式编程(4)-线程栈[2]
三、栈内存
1、每个WINDOWS都有一个栈基址和栈限址,二者合在一起表示栈的有效内存范围。栈限址不是固定的,程序需要更多内存空间里,栈限址没有超过保留的栈内存范围,则可以要求更多的内存页
2、在栈限址外是栈的守护页,当访问到守护页时,会引发STATUS_GUARD_PAGE_VIOLATION异常,当异常发生后,操作系统捕捉后,提交下一页内存,然后将其做为新的守护页,这相当于分配了一个新的页给 ...
VB.NET并行与分布式编程(4)-线程栈[1]
1、用调试器调试线程
1)栈调用
以下面代码为例
Imports System.Threading
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim main_x As ...
VB.NET并行与分布式编程(3)-线程局部存储TLS[3]
为了查看效果,我特意用随机数来代替固定的sleep时间,这样更有说明力。上面程序的运行结果如下:
五、TLS小结
1)TLS基础
可以使用托管线程本地存储区 (TLS) 存储某一线程和应用程序域所独有的数据。 .NET Framework 提供了两种使用托管 TLS 的方式:线程相关的静态字段和数据槽。 线程相关的静态字段提供的性能比数据槽的性能要好得多,而且它还启用了编译时类 ...
VB.NET并行与分布式编程(3)-线程局部存储TLS[2]
接上节,我们可以使用下面语句创建一个线程本地变量,利用静态TLS功能
Dim betterCounter As ThreadLocal(Of Integer) = New ThreadLocal(Of Integer)(Function() 1)betterCounter的值初始化为1。在本程序中,jg被初始化为50,并定义成线程本地变量
Dim jg As ThreadL ...
VB.NET并行与分布式编程(3)-线程局部存储TLS[1]
一、TLS种类
1)动态TLS
2)静态TLS
静态TLS的速度比动态TLS快,在编译期就决定,需要定义一个静态域来表示TLS数据,编译器有足够的信息来在编译期间内发射代码,动态TLS需要通过一个或多个函数调用来获得地址。
二、静态TLS
我们可以在线程函数中使用static声明一个静态的变量,这个变量会被所有使用这个函数的线程共享。比如,我们写一个简单的计算:
200-1-2-... ...
VB.NET并行与分布式编程(2)-线程终止
Imports System
Imports System.Threading
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
'创建线程对象
...
VB.NET并行与分布式编程(1)-创建与运行线程
Imports System
Imports System.Threading
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
'创建线程对象
...
并发带来的冲突
1、读/写冲突
2、写/写冲突
3、写/读冲突
4、读/读冲突
解决方法如下:
1、原子性
2、串行化
3、线性化
4、独立性
(1)进程间独立性
(2)进程内独立性
(3)事先约定的独立性