Типы пространства имен 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.