Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSISP Part 3.DOC
Скачиваний:
42
Добавлен:
11.05.2015
Размер:
360.45 Кб
Скачать
  1. Средства многопоточного программирования в среде .Net. Автономные потоки. Пул потоков.

По сути, поток - это обычный метод, такой же, как main() и все остальные (правда, есть некоторые ограничения: метод не может возвращать значение, а в качестве параметра может принимать только объект класса Object, или вообще не принимать параметров), только вот запускается он по-особому. А запускается он с помощью делегатов.

Для работы с многопоточностью среда .NET предоставляет нам целое пространство имен System.Threading. В данном пространстве имен содержится огромное количество различных типов, но чтобы не забивать голову лишней информацией, мы пока про них забудем. Для начала нам хватит класса Thread, который как раз и находится в данном пространстве имен. У данного класса есть много полезных для работы с потоком методов и свойств, например:

Start() - начинает выполнение потока

Suspend() - приостанавливает поток

Resume() - восстанавливает работу потока

Priority - свойство определяющие приоритет потока

А вот в методе main() выполняются более интересные вещи. Сначала мы создаем экземпляр класса ThreadClass. Далее мы создаем объект типа Thread и передаем ему в качестве параметра делегат ThreadStart содержащий ссылку на метод writestring().

Пул потоков — это коллекция потоков, которые могут использоваться для выполнения нескольких задач в фоновом режиме. Это позволяет разгрузить главный поток для асинхронного выполнения других задач.

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

Когда поток в пуле завершает выполнение задачи, он возвращается в очередь ожидания, в которой может быть повторно использован. Повторное использование позволяет приложениям избежать дополнительных затрат на создание новых потоков для каждой задачи.

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

Можно реализовать собственный пул потоков, но гораздо проще использовать пул, предоставляемый .NET Framework через класс ThreadPool.

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

Можно также поместить в очередь на обработку пулом потоков рабочие элементы, не связанные с операцией ожидания. Чтобы запросить обработку рабочего элемента потоком из пула, следует вызвать метод QueueUserWorkItem. Этот метод принимает в качестве параметра ссылку на метод или делегат, которые будут вызваны потоком, выбранным из пула потоков. После того, как рабочий элемент помещен в очередь, его обработка не может быть отменена.

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

Для каждого процесса существует один пул потоков. Пул потоков по умолчанию содержит 25 рабочих потоков на каждый доступный процессор и 1000 потоков завершения ввода/вывода. Количество потоков в пуле потоков может изменяться с помощью метода SetMaxThreads. Каждый поток использует заданные по умолчанию размер стека и приоритет выполнения.

Пул потоков поддерживает минимальное количество свободных потоков. Для рабочих потоков это минимальное количество соответствует количеству процессоров. Метод GetMinThreads возвращает минимальное количество свободных рабочих потоков и потоков завершения ввода/вывода.

Кода всем потокам из пула были назначены свои задачи, пул потоков не начинает немедленно создавать новые свободные потоки. Чтобы избежать ненужного выделения стекового пространства для потоков, он создает новые свободные потоки через определенные интервалы времени. Интервал в настоящее время составляет 0,5 сек; в будущих версиях платформы .NET Framework он может быть изменен.

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

Когда пул потоков повторно использует поток, он не очищает данные в локальной памяти стека или в полях, помеченных атрибутом ThreadStaticAttribute. Следовательно, данные, помещенные в локальное хранилище стека одним методом, могут быть доступны любому другому методу, выполняющемуся тем же потоком из пула. Метод, который обращается к полю, помеченному атрибутом ThreadStaticAttribute, может обнаружить там различные данные, в зависимости от того, каким именно потоком из пула этот метод выполняется.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]