Стан гонитви
|
|
Цю статтю потрібно вікіфікувати, щоб привести її вигляд до стандартів Вікіпедії. (Вересень 2012) |
Стан гонитви (англ. 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 не переривали під час доступу до змінної, отже його операція була несумісною.
Див. також [ред.]
Посилання [ред.]
|
||||||||||||||||||||||||||||||||

