Почему создание новой темы стоит дорого? - PullRequest
4 голосов
/ 11 апреля 2011

Я прочитал множество ресурсов .Net, говорящих мне, что я должен использовать поток пула потоков, а не создавать новый поток самостоятельно. Они говорят, что вы должны сделать это, потому что создание нового потока - дорогостоящая операция. Что происходит при создании потока, что делает его дорогостоящей операцией?

Ответы [ 4 ]

16 голосов
/ 12 апреля 2011

Все относительно. Создание новой темы стоит дорого ... по сравнению с созданием новой. Если вы не выполняете много работы для каждого потока, работа, связанная с созданием и разделением потоков, может потенциально составить измеримую часть вашего времени процессора. Но это дешево по сравнению с созданием нового процесса, особенно в Windows.

Также лучше использовать пул потоков, потому что он настроен, чтобы избежать одновременной активации слишком большого количества потоков. Вы редко хотите, чтобы за один раз было активным несколько потоков, или вы потратите много времени процессора на переключение контекста между ними. Использование пула потоков управляет этим для вас, поскольку дополнительные запросы помещаются в очередь до тех пор, пока рабочий поток не будет готов.

4 голосов
/ 12 апреля 2011

Каждый поток по умолчанию получает 1 МБ памяти.Это может быстро стать дорогим.

1 голос
/ 24 марта 2012

Threadpool - это не только амортизация затрат на создание и уничтожение потоков, но не только сохранение памяти с меньшим количеством стеков. Реальное преимущество этого состоит в том, что вы избегаете одновременного использования слишком большого количества активных потоков и минимизируете переключение контекста, если вы запускаете серверное приложение. Даже если вы не пишете серверное приложение, пул потоков - просто более приятная абстракция, чем поток - запустите асинхронную операцию, получите уведомление по завершении или выполните обратный вызов, когда закончите, и позвольте ОС или среде выполнения определить, сколько потоков создать.

1 голос
/ 23 марта 2012

Есть несколько факторов. Один из упомянутых это память для стека. Поскольку стековая память не обрабатывается обычным распределителем GC, используемым для объектов, создание стека потока и последующий отказ от него сильно отличается от создания мегабайтов объектов кучи и отказа от них.

Еще одним фактором, который еще не упомянут, является стоимость, связанная с такими вещами, как переменные потока. В некоторых системах, в которых требуются все статические переменные потока, которые поток может использовать для определения до запуска потока, запуск нового потока потребует инициализации всех статических переменных потока. Поскольку .net позволяет потокам динамически добавлять переменные потока, используемые структуры данных различны. Тем не менее, инициализация таких структур данных при запуске потока не является бесплатной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...