Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

DWORD WaitForMultіple0bjects(

Лабораторна робота № 4

Тема: «Механізм подій у Win32 API»

Мета роботи: ознайомитися із принципами роботи механізму подій у Win32 API та отримати практичні навички вирішення задач синхронізації з його допомогою

Теоретичні відомості

Події — це засоби сигналізації об'єктів для виклику деяких дій. Механізм подій на відміну від семафорів призначений виключно для синхронізації процесів.

Розрізняють два типи подій — з автоматичним (auto reset event) та ручним скиданням (manual reset event), а також два засоби їхньої сигналізації — функції PulseEvent( ) і SetEvent( ). Будь-який спосіб сигналізації можна використати з різ­ним типом подій. У поєднанні це дає чотири варіанти дій. Розглянемо такі дії од­ну за одною, але спочатку зупинимося на тому, як створювати події.

Створення події виконується зі змінною типу HANDLE за допомогою функції CreateEvent( ):

 

HANDLE CreateEvent( // повертає дескриптор створеної події

LPSECURITY_ATTRIBUTES sec_attrs //адреса_атрибутів_захисту,може бути 0

BOOL manual_reset //тип події, якщо TRUE — після створення відразу сигналізувати

BOOL initstate //прапор_початкового_стану

LPCTSTR evt_name //рядок з ім'ям або нульовий покажчик

)

 

Коли значення manual_reset дорівнює TRUE, то маємо подію із ручним скиданням, а коли воно дорівнює FALSE — з автоматичним.

HANDLE event = CreateEvent(0, TRUE, FALSE, 0); // ручне скидання

Для очікування сигналізації одного об'єкта у Win32 використовують функцію WaitForSingleObject( ):

DWORD WaіtForSingleОbject(HANDLE handle, DWORD timeout);

Параметр handle визначає дескриптор синхронізаційного об'єкта, а параметр і timeout задає максимальний час очікування в мілісекундах (значення INFINITE свідчить про нескінченне очікування).

Функція WaitForSingleObject( ) повертає такі значення: WAIT_0BJECT_0 — відбулася сигналізація об'єкта; WAIT_Timeout — минув час очікування (якщо timeout не дорівнював INFINITE), а об’єкт свого стану так і не змінив.

Для очікування сигналізації події використовують функцію очікування:

WaіtForSingleОbject(event, INFINITE);

Можна очікувати сигналізації не одного об'єкта, а кількох одразу. Для цього використовують функцію WaitForMultiple Objects( ):

 

DWORD WaitForMultіple0bjects(

DWORD count, // довжина масиву дескрипторів

CONST HANDLE *handles, // масив дескрипторів

BOOL waitall, // прапорець режиму очікування

DWORD timeout // аналогічно до WaitForSingleObject

);

 

Функція приймає масив дескрипторів handles завдовжки count (максимальна довжина масиву 64 елементи). Режим очікування і повернене значення залежать від прапорця waitall:

· Якщо waitall дорівнює TRUE, задано режим очікування всіх об'єктів. Очікування завершується у разі здійснення сигналізації всіх об'єктів, функція повертає значення WAIT_0BJECT_0.

· Якщо waitall дорівнює FALSE, задано режим очікування одного об'єкта. Очікування завершується у разі здійснення сигналізації хоча б одного з об'єктів, функція поверне WAIT_OBJECT_0+i, де і — індекс дескриптора цього об'єкта в масиві handles.

Тепер розглянемо різні варіанти зміни стану подій. Насамперед зазначимо, що всі функції сигналізації події та скидання її стану мають однаковий синтаксис:

BOOL SetEvent(HANDLE event);

BOOL ResetEvent(HANDLE event);

BOOL PulseEvent(HANDLE event);

BOOL OpenEvent(HANDLE event);

Під час виконання функції SetEvent( ) відбувається сигналізація події. Подальші дії залежать від типу події:

· Для подій з автоматичним скиданням поновлюють виконання одного потоку, який очікує на події. Якщо жоден потік на події не очікує, подія залишається в сигнальному стані доти, доки якийсь потік не спробує почати очікування на цій самій події. Після цього потік негайно продовжує виконання, а стан події автоматично скидається у несигнальний (наступні потоки очікуватимуть).

· Для подій з ручним скиданням поновлюються всі потоки, що очікують, подія залишається в сигнальному стані, тому всі наступні потоки негайно продовжуватимуть роботу в разі спроби виконати очікування Подія залишатиметься в такому стані доти, доки якийсь потік не скине її вручну за допомогою функції ResetEvent( ).

ResetEvent ( ) виконує скидання події (встановлює стан події в несигнальний).

PulseEvent( ) забезпечує встановлення стану події в сигнальний і наступне перемикання його в несигнальний після реалізації посилання сигналу очікуваним потокам. Виконання функції PulseEvent( ) подібне до двох послідовних викликів SetEvent( ) і ResetEvent( ). При цьому подію сигналізує і поновлює один із потоків, які очікують на події (для подій з автоматичним скиданням), або всі потоки, що очікують (для подій з ручним скиданням), після чого стан події скидається. Коли жодного потоку, що очікує на цю подію немає, подію негайно скидають і факт її сигналізації зникає. Виклик функції SetEvent( ) зберігає стан події, а виклик функції PulseEvent( ) — ні.

OpenEvent( ) повертає значення існуючого об'єкта-події.

Хід роботи

1. Реалізувати за допомогою механізму подій задачу, що складається з трьох потоків Р1, Р2 та Р3. Потік Р1 інформує потоки Р2 та Р3 про подію А, що відбулася в потоці Р1 (рис.2.1а).

2. Реалізувати за допомогою механізму подій задачу, що складається з трьох потоків Р1, Р2 та Р3. Потік Р1 інформує потік Р2 про подію А, що відбулася в потоці Р1. Після цього потік Р2 інформує потік Р3 про подію В, що відбулася в потоці Р2(рис.2.1б).

3. Реалізувати за допомогою механізму подій задачу, що складається з трьох потоків Р1, Р2 та Р3. Потік Р1 очікує настання подій А та В у потоках Р2 та Р3, відповідно (рис.2.1в).

Звіт повинен включати:

1. Тему, мету і порядок роботи.

2. Лістинг та скриншоти задач.

3. Висновки по роботі.

 

Рисунок 2.1 – Схеми синхронізації задач

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.