
- •Процессы и задачи в Microsoft Windows
- •Запуск задач
- •Управление запущенными задачами
- •Изменение приоритета задачи
- •Определение приоритета задачи
- •Приостановка и возобновление выполнения задачи
- •Временная приостановка работы задачи
- •Завершение задачи
- •Освобождение идентификатора задачи
- •Критические секции
- •Инициализация критической секции
- •Удаление критической секции
- •Вход в критическую секцию и выход из нее
- •4. Контрольные вопросы
- •5. Содержание работы
- •Создание объекта - событие
- •Открытие объекта - событие
- •Управление состоянием объекта - событие
- •Объекты – событие с автосбросом
- •Создание объекта Mutex
- •Освобождение идентификатора объекта Mutex
- •Открытие объекта Mutex
- •Как завладеть объектом Mutex
- •Освобождение объекта Mutex
- •Как работает семафор
- •Функции для работы с семафорами
- •Создание семафора
- •Уничтожение семафора •
- •Увеличение значения счетчика семафора
- •Уменьшение значения счетчика семафора
- •Определение текущего значения счетчика семафора
- •Создание и открытие ожидаемого таймера
- •Функции для работы с ожидаемым таймером
- •Контрольные вопросы
- •Содержание работы
- •Содержание отчета
- •Теоретический материал
- •7.1. Универсальные функции для работы с файлами в операционных системах Microsoft Windows
- •Функция CreateFile
- •Функция CloseHandle
- •Функции ReadFile и WriteFile
- •Механизм отображения файлов на память
- •Создание отображения файла
- •Выполнение отображения файла в память
- •Открытие отображения
- •Отмена отображения файла
- •Принудительная запись измененных данных
- •Обмен через файлы, отображаемые на память
- •Пример приложения, использующего файлы, отображаемые на память
- •Именованные и анонимные каналы
- •Имена каналов
- •Реализации каналов
- •Создание канала
- •Установка соединения с каналом со стороны сервера
- •Пример приложения, использующего каналы передачи данных Pipes
- •Создание канала Mailslot
- •Открытие канала Mailslot
- •Запись сообщений в канал Mailslot
- •Чтение сообщений из канала Mailslot
- •Определение состояния канала Mailslot
- •Изменение состояния канала Mailslot
- •Пример приложения, использующего каналы передачи данных MailSlot
- •Пример приложения, использующего передачу сообщений между процессами
Завершение задачи
Задача может завершиться по собственной инициативе и по инициативе другой задачи. В первом случае задача либо выполняет оператор возврата из функции задачи, либо пользуется специальными функциями.
Для того чтобы завершить свое выполнение, задача, запущенная с помощью функции CreateThread, может вызвать функцию ExitThread, передав ей код завершения:
VOID ExitThread(DWORD dwExitCode);
Для принудительного завершения дочерней задачи родительская задача может использовать функцию TerminateThread, передав ей идентификатор завершаемой задачи и код завершения:
BOOL TerminateThread( |
|
|
|
HANDLE hThread, |
// идентификатор завершаемой задачи |
|
DWORD dwExitCode); |
// код завершения |
Как родительская задача может получить код завершения дочерней задачи? Для этого она должна вызвать функцию GetExitCodeThread:
BOOL GetExitCodeThread( |
|
|
|
HANDLE hThread, |
// идентификатор завершаемой задачи |
|
LPDWORD IpExitCode); |
//адрес для приема кода завершения |
Если задача, для которой вызвана функция GetExitCodeThread, все еще работает, вместо кода завершения возвращается значение STILL_ACTIVE.
Освобождение идентификатора задачи
После завершения процесса идентификаторы всех созданных им задач освобождаются. Однако лучше, если приложение будет самостоятельно освобождать ненужные ей идентификаторы задач, так как они являются ограниченным системным ресурсом.
Для освобождения идентификатора задачи вы должны передать его функции CloseHandle, имеющей единственный параметр.
Еще одно замечание относительно освобождения идентификаторов задач и процессов приведено в следующей главе, посвященной процессам.
Критические секции
Критические секции являются наиболее простым средством синхронизации задач для обеспечения последовательного доступа к ресурсам. Они работают быстро, не снижая заметно производительности системы, но обладают одним существенным недостатком - их можно использовать только для синхронизации задач в рамках одного процесса.
Критическая секция создается как структура типа CRITICAL_SECTION:
CRITICAL_SECTION csWindowPaint;
Обычно эта структура располагается в области глобальных переменных, доступной всем запущенным задачам процесса. Так как каждый процесс работает в своем собственном адресном пространстве, вы не сможете передать адрес критической секции из одного процесса в другой. Именно поэтому критические секции нельзя использовать для синхронизации задач, созданных разными процессами.
В документации SDK отмечено, что структуру типа CRITICAL_SECTION нельзя перемещать или копировать.
Инициализация критической секции
Перед использованием критической секции ее необходимо проинициализировать, вызвав для этого функцию InitializeCriticalSection:
CRITICAL_SECTION csWindowPaint;
InitializeCriticalSection(&csWindowPaint);
Функция InitializeCriticalSection имеет только один параметр (адрес структуры типа CRITICALJSECTION) и не возвращает никакого значения.