ThreadPool.QueueUserWorkItem:随机时间增益......或巨大损失

时间:2017-05-22 09:42:26

标签: .net vb.net visual-studio

我在一个循环中使用一个相当耗时的过程(~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

0 个答案:

没有答案