【发布时间】:2011-02-14 05:25:09
【问题描述】:
我正在尝试编写一个多线程应用程序。
考虑以下代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sw As New Stopwatch
Dim sw2 As New Stopwatch
sw.Start()
For x As Integer = 0 To 150
Dim th As Thread = New Thread(New ThreadStart(AddressOf work))
th.Start()
Next
sw.Stop()
MsgBox(sw.Elapsed.ToString())
End Sub
Private Sub work()
End Sub
如果您按下表单上的按钮,则会循环启动 150 个线程。他们的工作子实际上并没有做任何事情......这只是开始大量线程的练习。
我在 16 核机器上运行它,它需要将近半秒才能完成。考虑到当在我的应用程序中实现此代码时,与使用所有 16 个内核相比,在单个线程上运行工作子程序(当它实际上包含有用的例程时)所需的时间更短,这非常离谱。
为什么启动线程需要这么长时间?只要您取出“th.start()”行,代码就会在半毫秒内执行。
有没有更快的启动线程的方法?我应该改用线程池系统吗?看起来多线程毫无意义,因为它实际上会导致比单线程慢得多的速度....考虑到简单地启动所有线程可能需要很长时间。
【问题讨论】:
-
是什么让您认为添加线程可以为您解决任何问题?他们制造的问题往往多于解决的问题。
-
我正在我的应用程序中同时处理许多不同的几何图形。我认为用于异步计算每个独立几何图形的多个线程比一个线程同步循环遍历每个几何图形要好。
-
很有可能调用
th.Start()会导致当前CPU 开始运行您刚刚启动的线程,从而使循环花费的时间比您预期的要长很多。如果你有一个循环来创建线程,而另一个循环来启动它们,会发生什么?
标签: .net multithreading performance threadpool