|
|||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||
|
Багатопотокові застосування
Багатозадачність в
сучасних операційних системах сприймається
як щось само собою зрозуміле
[ До появи Apple OS X
на комп'ютерах Macintosh не
було сучасних багатозадачних
операційних систем.
Правильно спроектувати операційну систему
з повноцінною багатозадачністю
дуже важко, тому за основу OS X
довелося узяти систему Unix.
]. Користувач розраховує на те,
що при одночасному
запуску текстового редактора і поштового
клієнта ці програми не конфліктуватимуть,
а при прийомі електронної
пошти редактор не перестане
працювати. При одночасному
запуску декількох програм
операційна система швидко перемикається
між програмами, по
черзі надаючи їм процесор
(якщо, звичайно, на комп'ютері
не встановлено декілька
процесорів). В результаті створюється ілюзія
одночасної роботи декількох
програм, оскільки навіть краща друкарка
(і найшвидше Інтернет-з'єднання)
не дожене за сучасним
процесором. Багатопоточність
(multithreading) в якомусь сенсі можна
розглядати як наступний
рівень багатозадачності: замість
того, щоб перемикатися між
різними програмами, операційна
система перемикається між
разнимі частямі однієї програми.
Наприклад, багатопотоковий поштовий
клієнт дозволяє приймати нові
повідомлення електронної пошти під
час читання або складання нових
повідомлень. У наш час
багатопоточність теж
сприймається багатьма
користувачами як належне. У VB
нормальної підтримки багатопоточності не
було ніколи. Правда, в Vb5 з'явився
один з її різновидів —
сумісна потокова модель (apartment threading).
Як ви незабаром побачите,
сумісна модель надає
в розпорядження програміста
частину переваг багатопоточності, але
не дозволяє використовувати
всі можливості повною мірою. Рано чи
пізно з учбової машини доводиться
пересідати на справжню, і VB .NET
став першою версією VB з підтримкою
вільної багатопотокової моделі.
Проте багатопоточність не належить
до можливостей, які легко
реалізуються в мовах
програмування і легко
освоюються програмістами. Чому? Тому що
в багатопотокових застосуваннях
можуть виникати дуже хитрі
помилки, які непередбачувано
з'являються і зникають (а такі помилки
найважче відладжувати).
Чесно попереджаємо: багатопоточність
— одна з складних
областей програмування.
Щонайменша неуважність приводить
до появи невловимих помилок,
на виправлення яких
йдуть астрономічні суми. З
цієї причини в справжньому
розділі приведено немало поганих
прикладів — ми навмисно написали їх
так, щоб
продемонструвати характерні помилки. У цьому
і полягає найбезпечніший підхід до
вивчення багатопотокового
програмування: ви повинні уміти
розгледіти потенційні проблеми,
коли на перший погляд все працює
нормально, і знати шляхи їх рішення.
Якщо ви хочете використовувати прийоми
багатопотокового програмування,
без цього не обійтися.
Але яким
би небезпечним не було
багатопотокове програмування,
при професійному
вирішенні деяких завдань воно
незамінне. Якщо ваші програми не
використовуватимуть багатопоточність там,
де це доречно, користувачі
сильно розчаруються і віддадуть
перевагу іншому продукту. Наприклад, лише
в четвертій версії
популярної поштової програми Eudora
з'явилися багатопотокові можливості,
без яких неможливо
собі представити жодну сучасну
програму для роботи з електронною
поштою. На той час, коли в Eudora
з'явилася підтримка
багатопоточності, багато
користувачів (у тому числі і один з
авторів цієї книги) перейшли на
інші продукти. Нарешті, в .NET
однопоточних програм просто не
буває. Всі програми .NET
є багатопотоковими, оскільки
складальник сміття виконується як
низькопріоритетний фоновий процес.
Як показано нижче, при серйозному
графічному програмуванні в .NET
правильна взаємодія
програмних потоків допомагає
запобігти блокуванню
графічного інтерфейсу при
виконанні програмою
тривалих операцій.
|
|
|||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||