Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекцій із Системного програмування та...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
786.31 Кб
Скачать

3. Синхронізація потоків

У середовищі, що дозволяє виконувати одночасно кілька потоків, дуже важливо синхронізувати їхня діяльність. Інакше потоки не зможуть коректно працювати з поділюваними областями даних.

Критичні секції. В Win32 API реалізований класичний механізм критичної секції. Для роботи із критичною секцією необхідно завести структуру CRITICAL_SECTION й ініціалізувати її викликом функції InitializeCriticalSection. Тепер всі потоки можуть використати функції EnterCriticalSection й LeaveCriticalSection для огородження критичного розділу коду. Істотно, що механізм критичних секцій може використатися тільки в рамках одного процесу.

Синхронізація потоків різних процесів. У кожному разі, синхронізація полягає в тому, що потік переводить себе в стан блокованого до настання якого або події. Для перекладу процесу в стан блокування використаються функції:

WaitForMultipteObjects

WaitForMultipleObjectsEx

WaitForSingleObject

WaitForSingleObjectEx

Вихід процесу зі стану блокування відбувається при настанні очікуваної події. Подія складається в зміні стану якого-небудь об'єкта. Практично будь-які об'єкти ядра (процеси, файли, транспортери й т.д.) можуть виступати в ролі синхронізуючих. Але існують об'єкти, призначені саме для синхронізації потоків: Mutex (mutually exclusive - взаємне виключення)

Семафори

Події

Об'єкти Mutex. Mutex - глобальний іменований об'єкт, що може належати тільки одному потоку. Якщо об'єкт Mutex належить якому-небудь потоку, то інші потоки не можуть захопити його. За допомогою об'єктів Mutex так само реалізується класичний алгоритм критичної секції. Загальна схема така: один з потоків породжує об'єкт Mutex і привласнює йому глобальне ім'я за допомогою функції CreateMutex. Інші потоки можуть використати функцію OpenMutex для одержання описувача об'єкта. Перед входом у критичну секцію потік викликає одну з функцій очікування, передаючи їй як параметр описувач об'єкта Mutex. Якщо об'єкт Mutex уже захоплений, то потік блокується до звільнення об'єкта. Якщо не захоплений, то виконання потоку триває, а об'єкт Mutex захоплюється. Для звільнення об'єкта Mutex використається функція ReteaseMutex.

Семафори. За допомогою об'єктів типу семафор реалізується класичний механізм семафорів1. При цьому як примітив P(S) виступає одна з функцій очікування, а як примітив V(S) - функція ReleaseSemaphore. При створенні семафора функцією CreateSemaphore можна визначити максимально припустиме значення змінної S.

Події. Події - самий примітивний різновид синхронізуючих об'єктів. Вони породжуються функцією CreateEvetnt і бувають двох типів «зі скиданням вручну» й «з автоматичним скиданням». Об'єкт подія може перебувати у двох станах: «зайнятий» (non-signaled) і «вільний» (signaled). Для перекладу об'єкта подія у вільний стан використається функція SetEvent, а для перекладу в зайняте - ResetEvent. За допомогою кожної з функцій очікування можна перевести потік, що викликав, у стан блокування до звільнення об'єкта подія. Якщо об'єкт подія є об'єктом «з автоматичним скиданням» то функція очікування автоматично переведе його в стан зайнятого.

Лекція 14

Тема: Структурна обробка виключень