кують процесів. Це рішення незадовільно за великої витрати машинного часу на численні перевірки, при цьому в програмі досить легко помилитися.
Для вирішення цієї проблеми була введена нова змінна синхронізації event (подія), з якою пов'язані операції await (чекати) і cause (викликати). Процес, який виконав операцію await (event), залишається у стані очікування, поки значення змінної event не зміниться. Ця зміна контролюється за допомогою операції cause . При настанні події, тобто виконанні операції cause (event), звільняються всі очікують його процеси, в той час як у випадку семафора звільняється лише один процес.
Операції з подіями можна реалізувати або за допомогою двійковій змінної, або за допомогою лічильника, при цьому основні принципи залишаються однаковими. Дієслово to await має значення не тільки «чекати», а й «міцний перед», тобто конструкцію await (А) можна трактувати, як «належить подія А». Дієслово to cause означає «бути причиною», спонукальним мотивом, «викликати небудь». Конструкція cause (А) інтерпретується як «викликати подія А» (В літературі і в операційних системах іноді використовуються й інші назви).
На противагу семафору, змінну події не можна використовувати для захисту ресурсу від конкуруючого доступу декількох процесів, оскільки за визначенням вона звільняє все очікують процеси. Вищенаведена проблема вирішується за допомогою змінної події і семафора, якщо всі програми мають такий вигляд var mutex: semaphore ; change: event ; begin while not condition do await (change); wait (mutex); (* Обробка загальних змінних *) signal (mutex); cause (change); end ; При кожній зміні змінної event всі процеси перевіряють condition, і тільки ті з них, для яких condition виконано, можуть продовжуватися.
Доступ до загального ресурсу захищений за допомогою семафора mutex, при цьому продовжується тільки один процес. Це рішення простіше, ніж засноване тільки на семафорах. Воно також більш ефективно, оскільки процеси перевіряють умови тільки тоді, коли це має сенс, тобто після зміни значення відповідних змінних. Важливий тип події в системах реального часу пов'язаний із зовнішніми перериваннями. Програма обробки - оброблювач переривань - чекає переривання. Коли воно відбувається, виконання обробника поновлюється.
взаимоисключения
Об'єкти-взаимоисключения (м'ютекси, mutex - від MUTual EXclusion) дозволяють координувати взаємне виключення доступу до ресурсу. Сигнальний стан об'єкта (тобто стан «встановлений») відповідає моменту часу, коли об'єкт не належить жодній з нитки і його можна «захопити». І навпаки, стан «скинутий» (Не сигнальне) відповідає моменту, коли яка-небудь нитка вже володіє цим об'єктом. Доступ до об'єкта дозволяється, коли нитка, що володіє об'єктом, звільнить його. синхронізація потік процес семафор
Дві (або більше) нитки можуть створити м'ютекс з одним і тим же ім'ям, викликавши функцію CreateMutex. Перша нит...