системі може привести до неправильного вирішення задачі або навіть до краху системи. 2. Критичні секції Важливим поняттям синхронізації потоків є поняття «критичної секції» програми.
Критична секція - це частина програми, результат виконання якої може непередбачувано змінюватися, якщо змінні, які стосуються цій частині програми, змінюються іншими потоками в той час, коли виконання цієї частини ще не завершено. Критична секція завжди визначається по відношенню до певних критичним даними , при неузгоджену зміні яких можуть виникнути небажані ефекти. У всіх потоках, що працюють з критичними даними, повинна бути визначена критична секція. У різних потоках критична секція складається в загальному випадку з різних послідовностей команд. Щоб виключити ефект гонок по відношенню до критичних даними, необхідно забезпечити, щоб у кожен момент часу в критичній секції, пов'язаної з цими даними, знаходився тільки один потік. При цьому неважливо, знаходиться цей потік в активному або в загальмованому стані. Цей прийом називають взаємним винятком . Операційна система використовує різні способи реалізації взаємного виключення. Деякі способи придатні для взаємного виключення при входженні в критичну секцію тільки потоків одного процесу, в той час як інші можуть забезпечити взаємне виключення і для потоків різних процесів. Найпростіший і в той же час самий неефективний спосіб забезпечення взаємного виключення полягає в тому, що операційна система дозволяє потоку забороняти будь переривання на час його знаходження в критичній секції. Однак цей спосіб практично не застосовується, так як небезпечно довіряти управління користувальницької потоку - він може надовго зайняти процесор, а при краху потоку в критичній секції крах потерпить вся система, тому що переривання ніколи не будуть дозволені.
Блокуючі змінні . Для синхронізації потоків одного процесу прикладний програміст може використовувати глобальні блокуючі змінні . З цими змінними, до яких всі потоки процесу мають прямий доступ, програміст працює, не звертаючись до системних викликів ОС.
Кожному набору критичних даних ставиться у відповідність двійкова змінна, якій потік привласнює значення 0, коли він входить в критичну секцію, і значення 1, коли він її залишає. Блокуючі змінні можуть використовуватися не лише при доступі до поділюваних даними, але і при доступі до ресурсів, що будь-якого виду. Якщо всі потоки написані з урахуванням вищеописаних угод, то взаємне виключення гарантується. При цьому потоки можуть бути перервані операційною системою в будь-який момент і в будь-якому місці, у тому числі в критичній секції.
Однак слід зауважити, що одне обмеження на переривання усе ж є. Не можна переривати потік між виконанням операцій перевірки і установки блокуючої змінної. Пояснимо це. Нехай у результаті перевірки змінної потік визначив, що ресурс вільний, але відразу після цього, не встигнувши встановити змінну в 0, був перерваний. За час його призупинення інший потік зайняв ресурс, увійшов у свою критичну секцію, але також був перерваний, не завершивши роботи з ресурсом. Коли управління було повернуто першому потоку, він, вважаючи ресурс вільним, встановив ознака зайнятості і почав виконувати свою критичну секцію. ...