Вопрос теоретический, делал я задачу тестовую для Veeam. Знаменитая задача про архиватор многопоточный. В моей реализации отдельный поток берет порцию данных и сжимает\разжимает ее. И мне прислали ответы на мою задачу. Запускать новый поток для обработки каждого блока менее оптимально, чем переиспользовать существующие потоки. Вопрос, что значит переиспользвоать существующие потоки. Когда они и так в семафоре стоят и жду когда семафор даст им возможность взять новую порцию данных. Не используются примитивы синхроинзации для обработки изменения состояний (реализовано ожидание на sleep’ах, что менее оптимально). Вопрос, что есть примитивы синхронизации для изменения состояний.
По поводу переиспользования потоков уже подсказали в комментах, для этого существует ThreadPool.
По поводу примитивов синхронизации. Windows имеет 4 примитива для синхронизации потоков:
AutoResetEvent/ManualResetEvent. Нечто подобное можно сделать при помощи Monitor.Pulse() и Monitor.Wait(). Но объекты Windows более функциональные.Monitor или в операторе C# lock.Кроме этого потоки можно синхронизировать по другим объектам, например потокам или процессам. Если вы в коде вызываете thread.Join(), вы синхронизируете один поток с окончанием работы другого.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости