- •1.Объекты ядра
- •2. Учет пользователей объектов ядра
- •3. Защита объектов ядра
- •4. Таблица описателей объектов ядра
- •5. Создание объекта ядра
- •6. Закрытие объекта ядра
- •7. Совместное использование объектов ядра несколькими процессами
- •8. Наследование описателя объекта
- •9. Изменение флагов описателя
- •10. Именованные объекты
- •11. Дублирование описателей объектов
- •12. Синхронизация с потоков с помощью объектов ядра
- •13. Wait-функции
- •13.1. Побочные эффекты успешного ожидания
- •14. События
- •15. Семафоры
- •16. Мьютексы
- •17. Отказ от объекта-мьютекса
- •18. Мьютексы и критические секции
- •19. Сводная таблица объектов, используемых для синхронизации потоков
- •20. Порядок выполнения работы
- •21. Контрольные вопросы
19. Сводная таблица объектов, используемых для синхронизации потоков
В следующей таблице суммируются сведения о различных объектах ядра применительно к синхронизации потоков.
Объект |
Находится в занятом состоянии, когда |
Переходит в свободное состояние, когда |
Побочный эффект успешного ожидания |
Процесс |
процесс еще активен |
процесс завершается (ExitProcess, TerminateProcess) |
Нет |
Поток |
поток еще активен |
поток завершается (ExitThread, TerminateThread) |
Нет |
Задание |
время, выделенное заданию, еще не истекло |
время, выделенное заданию, истекло |
Нет |
Файл |
выдан запрос на ввод-вывод |
завершено выполнение запроса на ввод-вывод |
Нет |
Консольный ВВОД |
ввода нет |
ввод есть |
Нет |
Уведомление об изменении файла |
в файловой системе нет изменений |
файловая система обнаруживает изменения |
Сбрасывается в исходное состояние |
Событие с автосбросом |
вызывается ResetEvent, PulseEvent или ожидание успешно завершилось |
вызывается SetEvent или PulseEvent |
Сбрасывается в исходное состояние |
Событие со сбросом вручную |
вызывается ResetEvent или PulseEvent |
вызывается SetEvent или PulseEvent |
Нет |
Ожидаемый таймер с автосбросом |
вызывается CancelWaitableTimer или ожидание успешно завершилось |
наступает время срабатывания (SetWaitableTimer) |
Сбрасывается в исходное состояние |
Ожидаемый таймер со сбросом вручную |
вызывается CancelWaitableTimer |
наступает время срабатывания (SetWaitableTimer) |
Нет |
Семафор |
ожидание успешно завершилось |
счетчик > 0 (ReleaseSemaphore) |
Счетчик уменьшается на 1 |
Мьютекс |
ожидание успешно завершилось |
поток освобождает мьютекс (ReleaseMutex) |
Передается потоку во владение |
Критическая секция (пользовательского режима) |
ожидание успешно завершилось (TryEnterCriticalSection) |
поток освобождает критическую секцию (LeaveCriticalSection) |
Передается потоку во владение |
20. Порядок выполнения работы
Создать родительский и дочерний процессы. Передать из родительского в дочерний дескриптор объекта ядра (открытого файла). В дочернем процессе произвести чтение данных из открытого файла. Для этого необходимо перенести указатель на начало файла.
Создать именованный объект событие (с автосбросом) в родительском процессе. Получить доступ к данному объекту из дочернего процесса. В дочернем процессе завести поток, который будет ожидать установки (освобождения) события. Данный поток должен будет записывать в открытый файл строку «Событие»+ имя_события.
Создать именованный объект семафор в родительском процессе со счетчиком равным двум. Получить доступ к нему из дочернего процесса. В родительском процессе завести поток. В дочернем процессе завести три потока. Каждый вновь заведенный поток в обоих процессах будет пытаться захватить ресурс, защищенный семафором. При удачном захвате ресурса поток записывает в файл «Поток N _ допущен к ресурсу» (указать номер потока). Далее следует задержка на 1 секунду с помощью Sleep (эмуляция обработки данных). В случае неудачной попытки захватить ресурс (истекает время таймаута – 0,5с ). Поток записывает в файл “Отказано в доступе. Поток N ” (указать номер потока). Для разделения общего ресурса – файла, в который все потоки заносят информацию использовать именованный мьютекс, который необходимо создать в родительском потоке и получить доступ к нему в дочернем процессе.
Из дочернего процесса запустить, еще один дочерний процесс и передать ему с помощью функции DuplicateHandle дескриптор открытого файла, ограничив доступ только на чтение. В новом процессе осуществить чтение данных из файла и вывод данных на консоль.
