Стан гонитви (англ. 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 не переривали під час доступу до змінної, отже його операція була несумісною.
Data race
Термін зазвичай стосується ситуації, коли операція з пам’яттю в одному потоці потенційно може спробувати отримати доступ до місця пам’яті, в яку записуються дані в іншому потоці в контексті, де це небезпечно. Це означає, що data race відрізняється від стану гонитви, оскільки можливий недетермінізм через синхронізацію навіть у програмі без data race, наприклад, у програмі, у якій усі звернення до пам’яті використовують лише атомарні операції.
Це може бути небезпечно на багатьох платформах тому, що якщо два потоки записують у область пам’яті одночасно, можливо, що область пам’яті зрештою буде містити довільну комбінацію бітів, що представляють значення, які кожен потік намагався записати. Це може призвести до пошкодження пам’яті, якщо отримане значення жоден з потоків не намагався записати. Подібним чином, якщо один потік читає з певного місця у той час, як інший потік записує в нього, для читання можливо повернеться значення, яке є довільною комбінацією бітів, що представляють значення, яке місце пам’яті зберігало до запису, і бітів, що представляють значення, що записується.
На багатьох платформах передбачені спеціальні операції (атомарні операції, або операції синхронізації) з пам'яттю для одночасного доступу; у таких випадках зазвичай одночасний доступ із використанням цих спеціальних операцій є безпечним, на відміну від інших операцій (операцій з даними).
C++
Стандарт С++11 у параграфі 1.10 визначає стан гонитви так:
- Обчислення двох виразів конфліктує якщо один з виразів змінює ділянку пам'яті, а другий читає або також змінює ту саму ділянку пам'яті.
- Перебіг програми має стан гонитви, якщо він містить в різних потоках дві дії, що конфліктують, щонайменше одна з яких не атомарна і жодна не відбувається перед іншою.
Див. також
Посилання
- Інформація про стан гонитви на сайті IBM (англ.)
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Stan gonitvi angl race condition race hazard stan elektroniki programnogo zabezpechennya abo inshoyi sistemi de povedinka sistemi zalezhit vid togo v yakij poslidovnosti abo zh z yakoyu trivalistyu vikonuyutsya okremi instrukciyi kodu Ce staye pomilkoyu koli odna abo kilka mozhlivih dij ye nebazhanimi Stan gonitvi ye specifichnoyu pomilkoyu proektuvannya sistemi traplyayetsya v bagatopotokovih i rozpodilenih programah Proyavlyayetsya nekontrolovano u vipadkovi momenti chasu i dosit chasto simptomi stanu gonitvi znikayut yaksho sprobuvati yiyi zlokalizuvati Svoyu nazvu otrimala vid shozhoyi pomilki proektuvannya elektronnih shem ta ponyattya peregoniv signaliv Programne zabezpechennyaStani gonitvi proyavlyayutsya v zastosunkah de okremi procesi abo potoki vikonannya zalezhat vid odnogo spilnogo stanu Diyi nad spilnim stanom ye kritichnimi sekciyami sho mayut buti nesumisnimi Nevdacha v comu prizvodit do mozhlivosti poshkodzhennya spilnogo stanu Stani gonitvi gorezvisno skladni dlya vidtvorennya i znevadzhennya bo kincevij rezultat ne ye deterministichnim i duzhe zalezhit vid vidnosnogo perebigu vikonuvannya procesiv sho vzayemodiyut Problemi sho zustrichayutsya v gotovih sistemah mozhut zniknuti pri zapusku v rezhimi znevadzhennya koli vidbuvayetsya dodatkove zhurnalyuvannya i pereviryannya abo koli priyednuyetsya znevadzhuvach Chasto takij stan nazivayut gajzenbagom Duzhe radyat unikati staniv gonitvi cherez uvazhne rozroblyannya programi a ne cherez vipravlyannya problemi potim Priklad Yak prostij priklad rozglyanemo dva potoki sho hochut zbilshiti na odinicyu globalnu cilochiselnu zminnu V ideali potribna taka poslidovnist operacij Potik 1 Potik 2 Cile 0 prochitati 0 zbilshiti 0 zapisati 1 prochitati 1 zbilshiti 1 zapisati 2 tak mi otrimayemo 2 yak i ochikuvali Odnak yaksho dva potoki zapustyatsya odnochasno bez blokuvannya abo sinhronizaciyi Potik 1 Potik 2 Cile 0 prochitati 0 prochitati 0 zbilshiti 0 zbilshiti 0 zapisati 1 zapisati 1 Kinceve znachennya 1 a ne 2 Ce stanetsya cherez te sho operaciyi zbilshennya vikonuyutsya sumisno nesumisni diyi ce taki yaki ne mozhna perervati pid chas dostupu do deyakih resursiv takih yak pam yat U pershomu vipadku Potik 1 ne pererivali pid chas dostupu do zminnoyi otzhe jogo operaciya bula nesumisnoyu Data race Termin zazvichaj stosuyetsya situaciyi koli operaciya z pam yattyu v odnomu potoci potencijno mozhe sprobuvati otrimati dostup do miscya pam yati v yaku zapisuyutsya dani v inshomu potoci v konteksti de ce nebezpechno Ce oznachaye sho data race vidriznyayetsya vid stanu gonitvi oskilki mozhlivij nedeterminizm cherez sinhronizaciyu navit u programi bez data race napriklad u programi u yakij usi zvernennya do pam yati vikoristovuyut lishe atomarni operaciyi Ce mozhe buti nebezpechno na bagatoh platformah tomu sho yaksho dva potoki zapisuyut u oblast pam yati odnochasno mozhlivo sho oblast pam yati zreshtoyu bude mistiti dovilnu kombinaciyu bitiv sho predstavlyayut znachennya yaki kozhen potik namagavsya zapisati Ce mozhe prizvesti do poshkodzhennya pam yati yaksho otrimane znachennya zhoden z potokiv ne namagavsya zapisati Podibnim chinom yaksho odin potik chitaye z pevnogo miscya u toj chas yak inshij potik zapisuye v nogo dlya chitannya mozhlivo povernetsya znachennya yake ye dovilnoyu kombinaciyeyu bitiv sho predstavlyayut znachennya yake misce pam yati zberigalo do zapisu i bitiv sho predstavlyayut znachennya sho zapisuyetsya Na bagatoh platformah peredbacheni specialni operaciyi atomarni operaciyi abo operaciyi sinhronizaciyi z pam yattyu dlya odnochasnogo dostupu u takih vipadkah zazvichaj odnochasnij dostup iz vikoristannyam cih specialnih operacij ye bezpechnim na vidminu vid inshih operacij operacij z danimi C Standart S 11 u paragrafi 1 10 viznachaye stan gonitvi tak Obchislennya dvoh viraziv konfliktuye yaksho odin z viraziv zminyuye dilyanku pam yati a drugij chitaye abo takozh zminyuye tu samu dilyanku pam yati Perebig programi maye stan gonitvi yaksho vin mistit v riznih potokah dvi diyi sho konfliktuyut shonajmenshe odna z yakih ne atomarna i zhodna ne vidbuvayetsya pered inshoyu Div takozhVzayemne blokuvannya Sinhronizaciya procesiv Atomarna operaciya Peregoni signalivPosilannyaInformaciya pro stan gonitvi na sajti IBM angl Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi