- •Экзаменационный билет № 1
- •Состояния потоков
- •Экзаменационный билет № 2
- •Экзаменационный билет № 3
- •Указатели файлов
- •Определение размера файла
- •Экзаменационный билет № 4
- •Экзаменационный билет № 5
- •Экзаменационный билет № 6
- •Экзаменационный билет № 7
- •Экзаменационный билет № 8
- •Экзаменационный билет № 9
- •Экзаменационный билет № 10
- •Экзаменационный билет № 11
- •Динамически компонуемые библиотеки
- •Статические и динамические библиотеки
- •Неявное связывание
- •Экзаменационный билет № 12
- •Мьютексы
- •Покинутые мьютексы
- •Экзаменационный билет № 13
- •Отображение файлов
- •Экзаменационный билет № 14
- •Стратегии обработки файлов
- •Экзаменационный билет № 15
- •Экзаменационный билет № 16
- •Экзаменационный билет № 17
- •Ожидание завершения потока
- •Экзаменационный билет № 18
- •Обзор потоков
- •Основные сведения о потоках
- •Семафоры
- •Экзаменационный билет № 19
- •Исключения и обработчики исключений
- •Экзаменационный билет № 20
- •Совместное использование объектов ядра приложениями и службами
- •Экзаменационный билет № 21
- •Экзаменационный билет № 22
- •Экзаменационный билет № 23
- •Блоки и строки окружения
- •Необходимость в синхронизации потоков
- •Экзаменационный билет № 24
- •Экзаменационный билет № 25
Экзаменационный билет № 23
Блоки и строки окружения процесса.
Блоки и строки окружения
Схема, представленная на рис. 6.1, включает блок окружения процесса. Блок окружения (environment block) процесса содержит последовательность строк вида:
Имя = Значение
Каждая строка окружения (environment string), будучи символьной строкой, заканчивается нулевым символом, а весь блок строк в целом завершается дополнительным нулевым символом. Одним из примеров широко используемых переменных среды является переменная PATH.
Чтобы передать информацию об окружении из родительского процесса в дочерний, параметр lpEnvironment при вызове функции CreateProcess следует установить равным NULL. В свою очередь, любой процесс может запросить или изменить свои переменные окружения или добавить новые в блок окружения.
Для получения, а также создания новых или изменения существующих переменных окружения используются следующие функции:
DWORD GetEnvironmentVariable(LPCTSTR lpName, LPTSTR lpValue, DWORD cchValue)
BOOL SetEnvironmentVariable(LPCTSTR lpName, LPCTSTR lpValue)
lpName — указатель на строку, содержащую имя переменной окружения. После определения переменной окружения она добавляется в блок окружения при условии, что такая переменная ранее не существовала, а определяемое значение не равно NULL. Если же определяемое значение равно NULL, то переменная удаляется из блока. Строка значения не может содержать символы "=".
В случае успешного завершения функция GetEnvironmentVariable возвращает длину строки значения переменной окружения, иначе — 0. Если размер буфера lpValue, указанный значением параметра cchValue, оказался недостаточно большим, то возвращаемое значение равно количеству символов, которое фактически требуется для сохранения значения переменной. Вспомните, что аналогичный механизм используется и в функции GetCurrentDirectory
2. Синхронизация потоков.
Потоки могут значительно упростить разработку и реализацию программы,
а также повышают ее быстродействие, но использование потоков требует
внимательного отношения к защите общих ресурсов от их совместного
изменения. Объекты синхронизации могут использоваться как для обеспечения
синхронизации потоков одного процесса, так и для синхронизации потоков
различных процессов.
Объекты синхронизации и функции ожидания
В операционных системах Windows объектами синхронизации называются
объекты ядра, которые могут находиться в одном из двух состояний:
сигнальном (signaled) и несигнальном (nonsignaled).
Объекты синхронизации могут быть разбиты на четыре класса.
К первому классу относятся объекты, которые служат только для решения
задач синхронизации параллельных потоков. К ним относятся: мьютекс
(mutex), событие (event), семафор (semaphore).
Ко второму классу относится ожидающий таймер (waitable timer),
который переходит в сигнальное состояние по истечении заданного интервалавремени.
К третьему классу относятся объекты, которые переходят в сигнальное
состояние по завершении своей работы: работа (job), процесс (process), поток(thread).
К четвертому классу относятся объекты, которые переходят в сигнальное
состояние после получения сообщения об изменении содержимого объекта. К ним относятся: изменение состояния каталога (change notification),
консольный ввод (console input).
Потоки могут упрощать проектирование и реализацию программ и повышать их производительность, но их использование требует принятия мер по защите разделяемых ресурсов от попыток их изменения одновременно несколькими потоками, а также создания таких условий, при которых потоки выполняются лишь в ответ на запрос или тогда, когда это является необходимым. В настоящей главе представлены способы решения этих задач с помощью объектов синхронизации Windows — критических участков кода, мьютексов, семафоров и событий, а также описаны некоторые из проблем, например, взаимоблокировка потоков и возникновение состязаний между ними, которые могут наблюдаться в результате неправильного использования потоков. Объекты синхронизации могут применяться для синхронизации потоков, принадлежащих как одному и тому же, так и различным процессам.
Примеры иллюстрируют объекты синхронизации, а также создают почву для обсуждения как положительных, так и отрицательных аспектов применения тех или иных методов синхронизации на производительность. В последующих главах демонстрируется использование синхронизации для решения дополнительных задач программирования и повышения производительности программ, а также рассказывается о возможных ловушках и применении более развитых средств.
Синхронизация потоков является одной из важнейших и интереснейших тем и играет существенную роль почти в любом многопоточном приложении. Тем не менее, те из читателей, которые заинтересованы главным образом в межпроцессном взаимодействии, сетевом программировании и построении серверов с многопоточной поддержкой, могут перейти непосредственно к главе 11 и вернуться к изучению глав 8-10 в качестве вспомогательного материала, лишь в том случае, если в этом возникнет необходимость.
