
- •Процессы и задачи в 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
- •Пример приложения, использующего передачу сообщений между процессами
Объекты – событие с автосбросом
Для объектов - событий с автосбросом действует следующее правило: когда его ожидание потоком успешно завершается, этот объект автоматически сбрасывается в занятое состояние. Отсюда и произошло название таких объектов - событий Для такого объекта не требуется вызывать функцию ResetEvent, поскольку система сама восстанавливает его состояние А для событий со сбросом вручную никаких побочных эффектов после успешного ожидания не предусмотрено.
7.3. Объекты Mutex
Если необходимо обеспечить последовательное использование ресурсов задачами, созданными в рамках разных процессов, вместо критических, секций необходимо использовать объекты синхронизации Mutex. Свое название они получили от выражения "mutually exclusive", что означает; "взаимно исключающий". Однако допускается использовать объект Mutex для обеспечения последовательного использования ресурсов задачами, созданными в рамках одного процесса.
Объект Mutex может находиться в отмеченном или неотмеченном состоянии. Когда какая-либо задача, принадлежащая любому процессу, становится владельцем объекта Mutex, последний переключается в неотмеченное состояние. Если же задача "отказывается" от владения объектом Mutex, его состояние становится отмеченным.
Организация последовательного доступа к ресурсам с использованием объектов Mutex возможна потому, что в каждый момент только одна задача, может владеть этим объектом. Все остальные задачи для того, чтобы завладеть объектом, который уже захвачен, должны ждать, например, с помощью уже функции WaitForSingleObject.
Для того чтобы объект Mutex был доступен задачам, принадлежащим различным процессам, при создании вы должны присвоить ему имя. Данное имя будет глобальным для всех процессов.
Создание объекта Mutex
Для создания объекта Mutex вы должны использовать функцию CreateMutex, прототип которой мы привели ниже:
HANDLE CreateMutex( |
|
|
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes |
// атрибуты защиты |
|
BOOL bInitialOwner |
// начальное состояние |
|
LPCTSTR IpName); |
// имя объекта Mutex |
В качестве первого параметра (атрибуты защиты) вы можете указать значение NULL.
Параметр bInitialOwner определяет начальное состояние объекта Mutex. Если он имеет значение TRUE, задача, создающая объект Mutex, будет им владеть сразу после создания. Если же значение этого параметра равно FALSE, после создания объект Mutex не будет принадлежать ни одной задаче, пока не будет захвачен ими явным образом.
Через параметр IpName вы должны передать указатель на имя объекта Mutex. Это имя не должно содержать символ "\" и его длина не должна превышать значение МАХ_РАТН.
Если объект Mutex будет использован только задачами одного процесса, вместо адреса имени можно указать значение NULL. В этом случае будет создан "безымянный" объект Mutex.
Функция CreateMutex возвращает идентификатор созданного объекта Mutex или NULL при ошибке.
Возможно возникновение такой ситуации, когда приложение пытается создать объект Mutex с именем, которое уже используется в системе другим объектом Mutex. В этом случае функция CreateMutex вернет идентификатор существующего объекта Mutex, а функция GetLastError, вызванная сразу после вызова функции CreateMutex, вернет значение ERROR_ALREADY_EXISTS. Заметим, что функция создания объектов-событий CreateEvent ведет себя в данной ситуации аналогичным образом.