Типы пространства имен System.Threading

Лабораторная работа № 5.

Потоки и процессы в Microsoft Visual Studio.

5.1. Цель работы

Научиться писать многозадачные приложения с использованием средств Microsoft Visual Studio.

5.2. Теоретические сведения

Потоки – это наборы команд, которые могут получать время процессора. Время процессора выделяется квантами. Квант времени – это минимальный ин-

тервал, в течение которого только один поток использует процессор. Как ми- нимум, каждый процесс имеет хотя бы один (главный) поток, но ОС, начиная с Windows95 и NT, позволяют в рамках процесса запустить произвольное число потоков. Существует две модели применения потоков – асимметричная и сим- метричная.

В рамках асимметричной модели потоки решают различные задачи и, как

правило, не разделяют совместные ресурсы. В симметричной модели потоки выполняют одну и ту же работу, разделяют одни ресурсы и исполняют один код.

Исполняемая программа в терминологии операционной системы обозна- чается как «процесс». Процесс состоит из виртуальной памяти, исполняемого кода, потоков и данных. Процесс может содержать много потоков, но обяза- тельно по крайней мере содержит хотя бы один. Потоку, как правило, предос-

тавляется минимум ресурсов, он зависит от процесса, который и распоряжается виртуальной памятью, кодом, данными, файлами и другими ресурсами ОС.

При работе с потоками могут возникать две следующих проблемы – гон- ки и тупики. Ситуация гонок возникает, когда два или более потока пытаются получить доступ к общему ресурсу и изменить его состояние. Например, По- ток1 получил доступ к ресурсу и изменил его в своих интересах; затем активи-

зировался Поток2 и модифицировал этот же ресурс до завершения Потока1. Поток1 полагает, что ресурс остался в том же состоянии, в каком был до пере- ключения. В зависимости от того, когда именно был изменен ресурс, результа- ты могут варьироваться – иногда код будет исполняться нормально, а иногда нет, т.к. планировщик ОС может запускать и останавливать потоки в любое время. Ситуация тупиков возникает, когда поток ожидает ресурс, который в

данный момент принадлежит другому потоку. Например, Поток1 захватывает объект А и , для того чтобы продолжить работу, ждет возможности захватить объект Б. В то же время Поток2 захватывает объект Б и ждет возможности за- хватить объект А. Таким образом, оба потока будут заблокированы. Возникно- вения как ситуаций гонок, так и тупиков можно избежать, если пользоваться средствами синхронизации потоков.

Когда создается поток, то ему назначается приоритет, соответствующий

приоритету породившего его процесса. Процессы имеют следующие приорите-

ты – реального времени (Real Time), высокий (High), нормальный (Normal), фо- новый (Idle).

Поддержка многопоточности осуществляется в .NET в основном с помо-

щью пространства имен System.Threading. Некоторые из типов этого про- странства имен приведены в таблице 5.1.

Типы пространства имен System.Threading

Таблица 5.1


Тип Описание
Interlocked Класс, обеспечивающий синхронизированный дос- туп к переменным, которые используются в разных потоках
Monitor Класс, обеспечивающий синхронизацию доступа к объектам
Mutex Класс-примитив синхронизации, который использу- ется также для синхронизации между процессами
ReaderWriterLock Класс, определяющий блокировку, поддерживаю- щую один доступ на запись и несколько – на чтение
Thread Класс, который создает поток, устанавливает его приоритет, получает информацию о состоянии
ThreadPool Класс, используемый для управления набором взаимосвязанных потоков – пулом потоков
Timer Класс, определяющий механизм вызова заданного метода в заданные интервалы времени для пула по- токов
WaitHandle Класс, инкапсулирующий объекты синхронизации, которые ожидают доступа к разделяемым ресурсам
IOCompletionalCallback Класс, получающий сведения о завершении опера- ции ввода-вывода
ThreadStart Делегат, представляющий метод, который должен быть выполнен при запуске потока
TimerCallback Делегат, представляющий метод, обрабатывающий вызовы от класса Timer
WaitCallback Делегат, представляющий метод для элементов классов ThreadPool
ThreadPrority Перечисление, описывающее приоритет потока
ThreadState Перечисление, описывающее состояние потока

Первичный поток создается автоматически. Для запуска вторичных по- токов используется класс Thread. Основные элементы класса Thread приве- дены в таблице 5.2.


Наши рекомендации