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

Ход работы

1. Изучить теоретические сведения из лекционного материала, ход работы и индивидуальное задание к данной лабораторной работе.

3. Разработать алгоритм, реализующий индивидуальное задание.

4. Разработать программу (консольное приложение Win32) при помощи средства разработки Visual Studio на языке программирования C++, в которой создать два потока, вычисляющих каждый свой диапазон значений функции. Вывод на консоль результатов расчетов синхронизировать с помощью мьютекса. Использовать учебный проект для выполнения индивидуального задания.

Индивидуальное задание

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

Рисунок 1 - Схема создания и взаимодействия потоков и мьютекса

Отчет по лабораторной работе должен содержать тему, цель, содержание индивидуального задания, листинг программы, скрин-шот результатов расчета.

Лабораторная работа № 3

Базовые механизмы взаимодействия потоков: события и семафоры

Цель: Получить навыки в следующих предметных областях:

  • создание и использование событий потоками;

  • создание и использование семафоров потоками;

  • особенности освобождения и использования функций ожидания на этих диспетчерских объектах.

Теоретические сведения

События

Событие ( event ) - это флаг общего доступа для нескольких по­токов. Существует несколько типов событий, каждый из которых предназначен для конкретной цели. Событие находится в сигнальном состоянии в случае, если соответствующий флаг установлен.

Со­бытия могут быть мануальными ( manual ) и единичными ( single ), соответственно оповещающие о том что событие произошло либо множество потоков сразу, либо единственный поток, после чего событие сбрасывается системой автоматически. Тип события указывается при его создании.

Для работы с событиями используются следующие функции:

CreateEvent - создает событие или открывает уже существующее событие;

OpenEvent - открывает существующее событие;

SetEvent - устанавливает событие (переводит его в сигнальное состояние);

ResetEvent - сбрасывает событие;

PulseEvent - переводит событие в сигнальное состояние на период времени, пока на это событие не прореагируют все ожидающие его потоки; после чего событие сбрасывается.

Эти функции имеют следующие параметры вызова.

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES IpSecurityAttributes, // атрибуты защиты

BOOL bManuaiReset, // тип события

BOOL blnitialState, // начальное состояние события

LPCTSTR lpName // имя события

);

BOOL SetEvent(

HANDLE hEvent // дескриптор события

);

BOOL ResetEvent(

HANDLE hEvent // дескриптор события

);

BOOL PuiseEvent(

HANDLE hEvent // дескриптор события

);

HANDLE OpenEvent(

DWORD dwDesiredAccess, // флаги доступа

BOOL blnheritHandle, // режим наследования

LPCTSTR lpName // имя события

);

Параметр dwDesiredAccess определяет доступ к событию и может быть равен любой логической комбинации следующих флагов:

EVENT_ALL_ACCESS – полный доступ (поток может выполнять над событием любые действия);

EVENT_MODIFY_STATE - модификация состояния (поток может использовать функции SetEvent и ResetEvent для изменения состояния события);

SYNCHRONIZE – синхронизация (поток может использовать событие в функциях ожидания).