我在一个循环中使用一个相当耗时的过程(~1ms)(~100000次调用),具有不同但不相互依赖的输入值。这是多线程的完美配置!
我使用ThreadPool.QueueUserWorkItem
处理多线程,并且我跟踪队列中有多少项,因此等待调用的任务不会超过6个(因此我有4个处理器,因此有4 + 6个任务)线程)
这种行为真的很奇怪。当我运行相同的代码(但可能是不同的编译或不同的数据,虽然没有差异可能产生很大的不同),或者: - Windows任务管理器告诉我所有4个线程几乎饱和,程序比单线程程序快2-3倍 - Windows任务管理器几乎没有使用任何处理器,程序比单线程版本慢得多。
我使用VS2015,并使用.NET framework 4.6.1
有没有人见过如此奇怪的行为?有没有办法避免这种时间损失?
Sub TaskMulti()
Dim threadlist(0 To System.Environment.ProcessorCount * 2 + 2 - 1) as integer
Dim ith as integer
For ith = 0 To UBound(threadlist)
threadFinished(ith) = True
Next
For i As Integer = 0 To UBound(AllTasks)
replay:
For ith = 0 To UBound(threadlist)
If threadFinished(ith) Then
threadFinished(ith) = False
threadlist(ith) = i
ThreadPool.QueueUserWorkItem(AddressOf TaskDoSimple, ith)
Exit For
End If
Next
If ith > UBound(threadlist) Then
Threading.Thread.Sleep(1)
GoTo replay
End If
End If
Next
replay2:
For ith = 0 To UBound(threadlist)
If Not threadFinished(ith) Then
Threading.Thread.Sleep(1)
GoTo replay2
End If
Next
Thread.CurrentThread.Priority = ThreadPriority.Normal
End Sub
Sub TaskDoSimple(i as integer)
'do the job knowing the job ID is threadlist(ith)
End Sub