创建多线程,出现有关问题,请高手帮助看看,多谢!
创建多线程,出现问题,请高手帮助看看,谢谢!!!
创建多线程,出现问题,请高手帮助看看,谢谢!!!
求教为何ISTRNew里ISHn所显示的不是从0到4,谢谢!!!
------解决方案--------------------
线程是并发的。他们本身不是顺序执行的,谁先谁后都有可能。
需要加上 SyncLock 同步
SyncLock(Me)
Debug.Print(ISHn & " HHHHHHHHHHHHHHHHHHHHHHHHH " & ZBGH(ISHn))
End SyncLock
------解决方案--------------------
ISHn是多个线程共享的,所以就算你注册线程2的时候ISHn是a,那么等线程2真正执行时并不一定是a,它可能已经被其它线程改得面目全非了。
使用多线程要注意,如果你在这类问题中想每一个线程都有一个固定的ISHn值反应当初for循环时的值,那么你应该把ISHn变量赋值给你注册线程之前的另外一个临时变量中,这样每一个线程使用这个独立的临时变量拷贝值来打印,而不是打印ISHn变量的值。
------解决方案--------------------
1. 如果 XTHTHS 这个类里没有静态变量,那么不锁定也不会有影响。
2. 所以应该找到有静态变量的地方进行同步
3. 如果同步范围过广,那么多线程无意义
4. VVn 因为是在线程里自己 New 的,所以SyncLock VVn 无用,关键还是找到
多个线程都可以访问的资源
5. 假设 hq 是要处理的工作资源, DRAWLINZT 是结果数组
(不知道 id 干什么用的,需要一一对应结果?如果要的话,建议结果用Dictionary(Of S, Of T) 保存)
While hq.Count > 0 循环处理下面
(1) 取的时候用 SyncLock hq 锁住,取出一个并从 hq 移除这个任务
(2) 运算中就不用锁了,各自处理自己的
(3) 结果计算完毕,用 SyncLock Me 锁住,放入一个结果
基于以上,对于共同的,能访问的资源加锁,其他不用。
无论用哪一种多线程编程模型,你要找到共享资源的地方同步。
创建多线程,出现问题,请高手帮助看看,谢谢!!!
求教为何ISTRNew里ISHn所显示的不是从0到4,谢谢!!!
- VB.NET code
Imports System.Threading Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click thread = New Thread(4) {} ISHn = 0 For ifd As Short = 0 To 4 ISHn = ifd thread(ifd) = New Thread(New ParameterizedThreadStart(AddressOf ISTRNew)) thread(ifd).Name = ifd.ToString() thread(ifd).Start() Next End Sub Private Function ISTRNew() Dim w1 As Integer, w2 As Integer Dim tmp As String Dim VVn As New XTHTHS Debug.Print(ISHn & " HHHHHHHHHHHHHHHHHHHHHHHHH " & ZBGH(ISHn))求教为何这里ISHn所显示的不是从0到4,谢谢!!! tmp = "{" & ZBGH(ISHn) & "}" & vbCrLf w1 = InStr(istr.ToUpper, tmp) : w2 = InStr(w1, istr.ToUpper, "ABCDEFGHIJKLMNOPQRSTUVWSYZ{}[]") SyncLock VVn Debug.Print(Mid(istr.ToUpper, w1 + Len(tmp), w2 - w1 - Len(tmp) - 1) & " " & ISHn) End SyncLock End Function
------解决方案--------------------
线程是并发的。他们本身不是顺序执行的,谁先谁后都有可能。
需要加上 SyncLock 同步
SyncLock(Me)
Debug.Print(ISHn & " HHHHHHHHHHHHHHHHHHHHHHHHH " & ZBGH(ISHn))
End SyncLock
------解决方案--------------------
ISHn是多个线程共享的,所以就算你注册线程2的时候ISHn是a,那么等线程2真正执行时并不一定是a,它可能已经被其它线程改得面目全非了。
使用多线程要注意,如果你在这类问题中想每一个线程都有一个固定的ISHn值反应当初for循环时的值,那么你应该把ISHn变量赋值给你注册线程之前的另外一个临时变量中,这样每一个线程使用这个独立的临时变量拷贝值来打印,而不是打印ISHn变量的值。
------解决方案--------------------
1. 如果 XTHTHS 这个类里没有静态变量,那么不锁定也不会有影响。
2. 所以应该找到有静态变量的地方进行同步
3. 如果同步范围过广,那么多线程无意义
4. VVn 因为是在线程里自己 New 的,所以SyncLock VVn 无用,关键还是找到
多个线程都可以访问的资源
5. 假设 hq 是要处理的工作资源, DRAWLINZT 是结果数组
(不知道 id 干什么用的,需要一一对应结果?如果要的话,建议结果用Dictionary(Of S, Of T) 保存)
While hq.Count > 0 循环处理下面
(1) 取的时候用 SyncLock hq 锁住,取出一个并从 hq 移除这个任务
(2) 运算中就不用锁了,各自处理自己的
(3) 结果计算完毕,用 SyncLock Me 锁住,放入一个结果
基于以上,对于共同的,能访问的资源加锁,其他不用。
无论用哪一种多线程编程模型,你要找到共享资源的地方同步。