Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Ограничение числа потоков в пуле




CLR позволяет разработчикам задавать максимальное число рабочих потоков и потоков ввода-вывода в пуле, а CLR гарантирует, что число созданных потоков никогда не превысит заданное.

Верхний предел числа потоков в пуле задавать не следует — это может привести к нехватке процессорного времени и даже к взаимной блокировке потоков. Только представьте: 1000 рабочих элементов в очереди блокируются одним событием, которое освобождает 1001-й элемент. Если максимальное число потоков в пуле — 1000, 1001-й рабочий элемент не выполнится, и все 1000 потоков окажутся заблокированными навсегда. Сама идея ограничения числа потоков, реализованная в CLR, неудачна, потому что из-за нее программисты впустую тратят время. В предыдущих версиях CLR максимальное число рабочих потоков и потоков ввода-вывода было ограничено небольшим значением по умолчанию, что иногда приводило к взаимной блокировке и недостатку процессорных ресурсов. К счастью, команда разработчиков CLR учла этот момент и в CLR версии 2.0 увеличила максимальное число рабочих потоков по умолчанию до 25 на каждый процессор компьютера, а число потоков ввода-вывода — до 1000. Последнее, в сущности, не накладывает никакого ограничения. Полностью убирать эти ограничения нельзя, потому что в таком случае нарушится работа приложений, созданных для предыдущих версий CLR. Кстати, в API Win32 нет средств ограничения числа потоков в пуле — по указанным выше причинам.

В классе System.Threading.ThreadPool есть несколько статических методов, которые служат для изменения числа потоков в пуле. Вот прототипы этих методов:

void GetMaxThreads(out Int32 workerThreads, out Int32 completionPortThreads);

Boolean SetMaxThreads(Int32 workerThreads, Int32 completionPortThreads);

void GetMinThreads(out Int32 workerThreads, out Int32 completionPortThreads);

Boolean SetMinThreads(Int32 workerThreads, Int32 completionPortThreads);

void GetAvailableThreads(out Int32 workerThreads, out Int32 completionPortThreads);

Метод GetMaxTbreads позволяет узнать максимальное число потоков в пуле. Для изменения этого значения служит метод SetMaxThreads. Не рекомендую вызывать эти методы. Манипуляции с максимальным числом потоков в пуле обычно ухудшают, а не улучшают производительность приложения. Если же приложению нужно больше 25 потоков на процессор, значит, в его архитектуре и способе использования потоков есть серьезные изъяны.

Вместе с тем, в пул потоков CLR заложен механизм предотвращения слишком частого создания потоков — разрешается создавать не более одного потока в 500 мс. Некоторых разработчиков это не устраивает, потому что задания из очереди обрабатываются медленнее. В этом случае в приложение можно добавить вызов метода SetMinThreads и передать в него минимальное допустимое число потоков в пуле. Пул быстро создаст указанное число потоков, а если при появлении в очереди новых заданий все потоки будут заняты, он продолжит создавать потоки со скоростью не более одного потока в 500 мс. По умолчанию минимальное число рабочих потоков и потоков ввода-вывода равно 2. Я узнал это, вызвав метод GetMinThreads.

Метод GetAvailableThreads позволяет узнать число дополнительных потоков, которые разрешено добавить в пул. Он возвращает максимальное число потоков за вычетом текущего числа потоков в пуле. Значение, возвращаемое этим методом, действительно лишь на момент вызова метода — к тому моменту, когда метод вернет управление приложению, в пул могут быть добавлены новые потоки или уничтожены имеющиеся. Этот метод вызывается в приложении лишь для диагностики, мониторинга или настройки производительности.


 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 94; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты