Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab7.doc
Скачиваний:
4
Добавлен:
12.11.2019
Размер:
287 Кб
Скачать
☆

19. Сводная таблица объектов, используемых для синхронизации потоков

В следующей таблице суммируются сведения о различных объектах ядра применительно к синхронизации потоков.

Объект

Находится в занятом состоянии, когда

Переходит в свободное состояние, когда

Побочный эффект успешного ожидания

Процесс

процесс еще активен

процесс завершается (ExitProcess, TerminateProcess)

Нет

Поток

поток еще активен

поток завершается (ExitThread, TerminateThread)

Нет

Задание

время, выделенное заданию, еще не истекло

время, выделенное заданию, истекло

Нет

Файл

выдан запрос на ввод-вывод

завершено выполнение запроса на ввод-вывод

Нет

Консольный ВВОД

ввода нет

ввод есть

Нет

Уведомление об изменении файла

в файловой системе нет изменений

файловая система обнаруживает изменения

Сбрасывается в исходное состояние

Событие с автосбросом

вызывается ResetEvent, PulseEvent или ожидание успешно завершилось

вызывается SetEvent или PulseEvent

Сбрасывается в исходное состояние

Событие со сбросом вручную

вызывается ResetEvent или PulseEvent

вызывается SetEvent или PulseEvent

Нет

Ожидаемый таймер с автосбросом

вызывается CancelWaitableTimer или ожидание успешно завершилось

наступает время срабатывания (SetWaitableTimer)

Сбрасывается в исходное состояние

Ожидаемый таймер со сбросом вручную

вызывается CancelWaitableTimer

наступает время срабатывания (SetWaitableTimer)

Нет

Семафор

ожидание успешно завершилось

счетчик > 0 (ReleaseSemaphore)

Счетчик уменьшается на 1

Мьютекс

ожидание успешно завершилось

поток освобождает мьютекс (ReleaseMutex)

Передается потоку во владение

Критическая секция (пользовательского режима)

ожидание успешно завершилось (TryEnterCriticalSection)

поток освобождает критическую секцию (LeaveCriticalSection)

Передается потоку во владение

20. Порядок выполнения работы

  1. Создать родительский и дочерний процессы. Передать из родительского в дочерний дескриптор объекта ядра (открытого файла). В дочернем процессе произвести чтение данных из открытого файла. Для этого необходимо перенести указатель на начало файла.

  2. Создать именованный объект событие (с автосбросом) в родительском процессе. Получить доступ к данному объекту из дочернего процесса. В дочернем процессе завести поток, который будет ожидать установки (освобождения) события. Данный поток должен будет записывать в открытый файл строку «Событие»+ имя_события.

  3. Создать именованный объект семафор в родительском процессе со счетчиком равным двум. Получить доступ к нему из дочернего процесса. В родительском процессе завести поток. В дочернем процессе завести три потока. Каждый вновь заведенный поток в обоих процессах будет пытаться захватить ресурс, защищенный семафором. При удачном захвате ресурса поток записывает в файл «Поток N _ допущен к ресурсу» (указать номер потока). Далее следует задержка на 1 секунду с помощью Sleep (эмуляция обработки данных). В случае неудачной попытки захватить ресурс (истекает время таймаута – 0,5с ). Поток записывает в файл “Отказано в доступе. Поток N ” (указать номер потока). Для разделения общего ресурса – файла, в который все потоки заносят информацию использовать именованный мьютекс, который необходимо создать в родительском потоке и получить доступ к нему в дочернем процессе.

  4. Из дочернего процесса запустить, еще один дочерний процесс и передать ему с помощью функции DuplicateHandle дескриптор открытого файла, ограничив доступ только на чтение. В новом процессе осуществить чтение данных из файла и вывод данных на консоль.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]