Стан гонитви

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

Програмне забезпечення[ред.ред. код]

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

Стани гонитви горезвісно складні для відтворення і зневадження, бо кінцевий результат не є детерміністичним і дуже залежить від відносного перебігу виконування процесів, що взаємодіють. Проблеми, що зустрічаються в готових системах можуть зникнути при запуску в режимі зневадження, коли відбувається додаткове журналювання і перевіряння або коли приєднується зневаджувач. Часто такий стан називають гайзенбагом. Дуже радять уникати станів гонитви через уважне розробляння програми, а не через виправляння проблеми потім.

Приклад[ред.ред. код]

Як простий приклад розглянемо дві ниті, що хочуть збільшити на одиницю глобальну цілочисельну змінну. В ідеалі, потрібна така послідовність операцій:

Нить 1 Нить 2 Ціле
0
прочитати 0
збільшити 0
записати 1
прочитати 1
збільшити 1
записати 2

так ми отримаємо 2, як і очікували. Однак, якщо дві ниті запустяться одночасно без блокування або синхронізації:

Нить 1 Нить 2 Ціле
0
прочитати 0
прочитати 0
збільшити 0
збільшити 0
записати 1
записати 1

Кінцеве значення 1, а не 2. Це станеться через те, що операції збільшення виконуються сумісно. несумісні дії — це такі, які не можна перервати під час доступу до деяких ресурсів, таких як пам'ять. У першому випадку, Нить 1 не переривали під час доступу до змінної, отже його операція була несумісною.

Див. також[ред.ред. код]

Посилання[ред.ред. код]