Г. Шилдт - С#4.0 Полное руководство (1160795), страница 166
Текст из файла (страница 166)
981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 Время выполнения: 00:00."00.0140000 Время выполнения: 0:00:00.014 Время выполнения: 0:00:00:00.0140000 Время выполнения: 0.014 секунды Форматирование перечислений В С№ допускается также форматировать значения, определяемые в перечислении. Вообще говоря, значения из перечисления могут отображаться как по имени, так и по значению.
Спецификаторы формата перечислений сведены в табл. 22.10. Обратите особое внимание на форматы 0 и р. Перед перечислениями, которые должны представлять битовые поля, следует указывать атрибут Г1адв. Как правило, в битовых полях хранятся значения, обозначающие отдельные двоичные разряды и упорядоченные Глава 22. Строки и форматирование 83д по степени числа 2. При наличии атрибута Е1адя имена всех битовых составляющих форматируемого значения, если, конечно, вто действительное значение, отображаются с помощью спецификатора 01 А с помощью спецификатора Е отображаются имена всех битовых составляющих форматируемого значения, если оно составляется путем логического сложения по ИЛИ двух или более полей, определяемых в перечислении.
Таблица 22.10. Спецификаторы формата перечислений Спецификатор Назначение Отображает значение в виде десятичного целого числа То же, что и Р Отображает имя значения. Если зто значение можно создать путем логического сложения по ИЛИ двух или более полей, определенных в перечислении, то данный спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо от того, задан атрибут Е1адя или нет То же, что и р Отображает имя значения.
Если перед форматируемым перечислением указывается атрибут Е1адя, то данный спецификатор отображает имена всех битовых составляющих заданного значения, если, конечно, зто допустимое значение То же, что и 5 Отображает значение в виде шестнадцатеричного целого числа. Дпя отображения как минимум восьми цифр форматируемое значение дополняется (при необходимости) начальными нулями То же, что и х В приведенной ниже программе демонстрируется применение спецификаторов формата перечислений. УУ Отформатировать перечисление. оягпд Буясеьо с1аяя Еппиуигоеио [ епога Р1геосгоп [ Ногтв, Боись, Еаят, Хеяс ) [Е1адя) епои Благия ) аеабу=Ох1, 01ГЬ1пе=Ох2, Хагсгпд=Ох4, тгапяи1СОК=Охз, Кесеттеок=Ох10, ОпЬ1пе=Ох20 ) ягягтс тогб на)п[) Ртгессгоп б = Рггесггоп.иеяг; Сопяо1е.нггсеьгпе["[Осо)", б); Сопяо1е.нгтгеЬ1пе["[О:Е)", б)Г Сопяо1е.нг1геьгпе["[О:Р)", б)г Сопяо1е.нгтсе11пе["[Осх)", с)); Бсагоя я = Бгагоя.веабу ) Бсасоя.тгапятгсок; 834 Часть! Е Бибаиатека Сй ТРЕ, рекомендуется теперь как основной подход к разработке многопоточных приложений.
Тем не менее накопленный опыт создания исходной многопоточной подсистемы по-прежнему имеет значение по целому ряду причин. Во-первых, уже существует немалый объем унаследованного кода, в котором применяется первоначальный подход к многопоточной обработке. Если приходится работать с таким кодом или сопровождать его, то нужно знать, как работает исходная многопоточная система. Во-вторых, в коде, опирающемся на ТРЕ, могут по-прежнему использоваться элементы исходной многопоточной системы, и особенно ее средства синхронизации. И в-третьих, несмотря на то что сама библиотека ТРЕ основывается на абстракции, называемой задачей, она по-прежнему неявно опирается на потоки и потоковые средства, описываемые в этой главе. Поэтому для полного усвоения и применения ТРЕ потребуются твердые знания материала, излагаемого в этой главе. И наконец, следует особо подчеркнуть, что многопоточная обработка представляет собой довольно обширную тему, и поэтому подробное ее изложение выходи~ за рамки этой книги.
В этой и последующей главах представлен лишь беглый обзор данной темы и демонстрируется ряд основополагающих методик. Следовательно, материал этих глав может служить введением в эту важную тему и основанием для дальнейшего ее самостоятельного изучения. Основы многопоточной обработки Различают две разновидности многозадачности: на основе процессов и на основе потоков.
В связи с этим важно понимать отличия между ними. Лрсцкс фактически представляет собои исполняемую программу. Поэтому многозадачность на основе ьроцессов — это средство, благодаря которому на компьютере могут параллельно выполняться две программы и более. Так, многозадачность на основе процессов позволяет одновременно выполнять программы текстового редактора, 'электронных таблиц и просмотра содержимого в Интернете. При организации многозадачности на основе процессов программа является наименьшей единицей кода, выполнение которой может координировать планировщик задач. Лоток представляет собой координируемую единицу исполняемого кода.
Своим происхождением этот термин обязан понятию "поток исполнения". При организации многозадачности на основе потоков у каждого процесса должен быть по крайней мере один поток, хотя их может быть и больше. Зго означает, что в одной программе одновременно могут решаться две задачи и больше.
Например, текст может форматироваться в редакторе текста одновременно с его выводом на печать, при условии, что оба эти действия выполнякзтся в двух отдельных потоках. Отличия в многозадачности на основе процессов и потоков могут быть сведены к следующему: многозадачность на основе процессов организуется для параллельного выполнения программ, а многозадачность на основе потоков — для параллельного выполнения отдельных частей одной программы. Главное преимущество многопоточной обработки заключается в том, что она позволяет писать программы, которые работают очень эффективно благодаря возможности выгодно использовать время простоя, неизбежно возникающее в ходе выполнения большинства программ.
Как известно, большинство устройств ввода-вывода, будь то устройства, подключенные к сетевым портам, накопители на дисках или клавиатура, работают намного медленнее, чем центральный процессор (ЦП). Поэтому большую Гвава 23. Многопоточное программирование. Часть первая: основы 835 часть своего времени программе приходится ожидать отправки данных на устройство ввода-вывода или приема информации из него. А благодаря многопоточной обработке программа может решать какую-нибудь другую задачу во время вынужденного простоя.
Например, в то время как одна часть программы отправляет файл через соединение с Интернетом, другая ее часть может выполнять чтение текстовой информации, вводимой с клавиатуры, а третья — осуществлять буферизацию очередного блока отправляемых данных. Поток может находиться в одном из нескольких состояний. В целом, поток может быть выполняюгнимся; гопювым к выполнению, как только он получит время и ресурсы ЦП; яриоспгановлвнным, т.е. временно не выполняющимся; возобновленным в дальнейшем; заблокированным в ожидании ресурсов для своего выполнения; а также завершенныгя, когда его выполнение окончено и не может быть возобновлено. В среде .НЕТ Егашетчог1 определены две разновидности потоков: яриорипгеягныи и фоновый. По умолчанию создаваемый поток автоматически становится приоритетным, но его можно сделать фоновым. Единственное отличие приоритетных потоков от фоновых заключается в том, что фоновый поток автоматически завершается, если в его процессе остановлены все приоритетные потоки.
В связи с организацией многозадачности на основе потоков возникает потребность в особого рода режиме, который называется сннхронизаниеи и позволяет координировать выполнение потоков вполне определенным образом. Для такой синхронизации в СФ предусмотрена отдельная подсистема, основные средства которой рассматриваются в этой главе. Все процессы состоят хотя бы из одного потока, который обычно называют основным, поскольку именно с него начинается П:ыполнение программы. Следовательно, в основном потоке выполнялись все приведенные ранее примеры программ. Из основного потока можно создать другие потоки.
В языке С4 и среде .НЕТ Ргашетчог1 поддерживаются обе разновидности многозадачности: на основе процессов и на основе потоков. Поэтому средствами С4 можно создавать как процессы, так и потоки, а также управлять и теми и другими. Для того чтобы начать новый процесс, от программирующего требуется совсем немного усилий, поскольку каждый предыдущий процесс совершенно обособлен от последующего.