Я пытаюсь написать многопоточное приложение.
Рассмотрим следующий код:
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 (), код выполняется за полсекунды.
Есть ли более быстрый способ запуска потоков? Должен ли я использовать систему потоков пула вместо? Похоже, что многопоточность бессмысленна, когда она может на самом деле приводить к гораздо более медленным скоростям, чем однопоточность ..., учитывая, что простая загрузка всех потоков может занять так много времени.