лічильника збільшиться тільки на одиницю, навіть при тому, що кожен потік думав, що він незалежно збільшує значення лічильника. Іншими словами, мінлива була збільшена двічі, але значення збільшилося тільки на одиницю. Якщо Ви запускаєте кілька форм, то відразу помітите, що число збільшень, що представляється змінною TotalIncrements, зростає набагато швидше, ніж лічильник GenericGlobalCounter.
Що, якщо мінлива являє об'єктний рахунок блокування - який стежить, коли об'єкт повинен бути звільнений? Що, якщо вона являє собою сигнал, який вказує, що ресурс знаходиться у використанні?
Така проблема може призвести до появи ресурсів, постійно недоступних в системі, до об'єкту, що блокується в пам'яті, або передчасно звільненому. Це може призвести до збоїв програми.
Цей приклад був розроблений, щоб досить просто побачити проблему, але спробуйте поекспериментувати зі значенням змінної OtherCodeDelay. Коли небезпечний код відносно невеликий в порівнянні з усією програмою, проблеми з'являться менш часто. Хоча це і звучить обнадійливо, але істина полягає в наступному. Проблеми Багатопотокового режиму можуть бути надзвичайно нестійкі і їх важко виявити. Це означає, що багато-режим потребує обережного підходу до проектуванню програми.
Рішення проблем багатопоточності
Є два щодо простих способи уникнути проблем багатопотокового режиму.
Уникайте загального використання глобальних змінних.
Додайте код синхронізації скрізь, де використовуються глобальні змінні.
Перший підхід використовується в основному в Visual Basic. Коли Ви включаєте багато-режим в Visual Basic додатки, всі глобальні змінні стануть локальними для специфічного потоку. Це властиво способом, з яким Visual Basic виконує apartment model threading - докладніше про це пізніше.
Початковий випуск Visual Basic 5.0 дозволяв використовувати багатопоточність тільки в компонентах, які не мали ніяких елементів інтерфейсу користувача. Так було тому що вони не мали безпечного потоку управління формами. Наприклад: коли Ви створюєте форму в Visual Basic, VB дає їй ім'я глобальної змінної (таким чином, якщо Ви маєте форму, іменовану Form1, Ви можете безпосередньо звертатися до її методам, використовуючи Form1.метод замість того, щоб оголосити окрему змінну форми). Цей тип глобальної змінної може викликати проблеми багатопотокового режиму, які Ви бачили раніше. Там були безсумнівно інші проблеми всередині управління формами. p> З service pack 2, керування формами Visual Basic було зроблено безпечним потоком. Це говорить про те, що кожен потік має власну глобальну змінну для кожної форми, визначеної у проекті.
Що нового в Service Pack 2
Зробивши потік управління формами безпечним, Service pack 2 надав можливість за допомогою Visual Basic створювати клієнтські додатки, що використовують багато-режим. p> Додаток має бути визначено як програма ActiveX Exe з установкою запуску з S...