105
У мультипрограмній системі з розділенням часу може виник-
нути несприятлива ситуація перемішування (interleaving), коли
потік T
1
виконує крок (1), потім витісняється потоком T
2
, який
виконує кроки (1) – (3), а вже після цього потік T
1
закінчує опе-
рацію, виконуючи кроки (2) – (3). В цьому випадку результуючий
приріст змінної Count дорівнюватиме 1 замість правильного
приросту – 2.
Складність проблеми синхронізації полягає в нерегулярності
виникаючих ситуацій: у попередньому прикладі можна предста-
вити й інший, сприятливіший розвиток подій. У даному випадку
все визначається взаємними швидкостями потоків і моментами їх
переривання. Ситуації, подібні тій, коли два або більш потоків
обробляють дані, що розділяються, і кінцевий результат залежить
від співвідношення швидкостей процесів, називаються гонками
(умови змагання, race conditions).
Для усунення умов змагання необхідно забезпечити кожному
потоку ексклюзивний доступ до даних, що розділяються. Такий
прийом називається взаємовиключенням (mutual exclusion).
Частина коду потоку, виконання якого може привести до race
condition, називається критичною секцією (critical section).
Наприклад, операції (1) – (3) в прикладі, наведеному вище, є кри-
тичними секціями обох потоків. Отже, взаємовиключення
необхідно забезпечити для критичних секцій потоків.
У загальному випадку структура процесу, що бере участь у
взаємодії, може бути представлена так:
while (some condition) do begin
entry section
critical section
exit section
remainder section end;
Зовнішній цикл означає, що нас цікавитимуть численні спроби
входу в критичну секцію (синхронізація одиничних попадань
може бути забезпечена й іншими засобами). Найбільш важливий
із погляду синхронізації пролог (entry section), де ухвалюється
рішення про те, чи може потік бути допущеним у критичну
секцію. У епілогу (exit section) зазвичай відкривається шлагбаум