КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Синхронізація. Раніше вже упоминалаось, що при програмуванні в COM+ рекомендується вибирати для нових класів потоковыю модель
Раніше вже упоминалаось, що при програмуванні в COM+ рекомендується вибирати для нових класів потоковыю модель ThreadingModel = Neutral. Усі екземпляри такого класу розміщуватимуться в одному апартаменті NA. Основна перевага цього апартаменту полягає в тому, що він не має пов'язаних з ним потоків, і потік з будь-якого іншого апартаменту, що зробив виклик методу об' єкту з NA, тимчасово покидає свій апартамент і виконує код викликаного методу. Відсутність перемикання потоків істотно знижує витрати на виклик. Проте, необхідно потурбуватися про синхронізацію. Сам апартамент NA ніяк не обмежує можливість паралельного виклику одного і того ж методу одного і того ж об' єкту з NA. У рамках COM синхронізація забезпечувалася або написанням потоко-безопасного коду (наприклад, шляхом використання критичних секцій), або об' єкт поміщався в STA апартамент. У COM+ з' являється нова можливість - декларація необхідності синхронізації шляхом завдання потрібного значення для відповідного атрибуту. Сама синхронізація забезпечується через механізм, заснований на понятті активність. Активність - множина з декількох контекстів, які можуть знаходитися не лише в різних апартаментах, але і в різних процесах і навіть на різних машинах. Будь-який контекст входити не більше ніж в одну активність. Можуть бути контексти, що не входять ні в одну активність. Включення контексту в деяку активність визначається атрибутом Synchronization об' єктів, що входять в контекст. У таблиці 3.1 приведені можливі значення цього атрибуту і їх вплив на входження контексту, якому належатиме об' єкт, що активується, в ту або іншу активність. При призначенні значення атрибуту Synchronization необхідно враховувати деякі обмеження. Саме, якщо потокова модель класу ThreadingModel=Apartment, або цей клас підтримує активацію із споживи, або він використовує сервіс транзакцій, необхідно вибрати для значення атрибуту синхронізації або REQUIRED, або REQUIRES_NEW. Тепер розглянемо власне механізм синхронізації. На рівні процесу активність блокується як тільки поступивши виклик до одного з об' єктів одного з її контекстів. Тільки після виконання цього виклику блокування знімається і інший виклик може увійти до активності. Для запобігання deadlock використовується відстежування ланцюжків викликів. Кожен виклик отримує унікальний ідентифікатор (GUID), і усі виклики, зроблені для виконання цього виклику, отримують тій же ідентифікатор. Виклик, ідентифікатор якого співпадає з ідентифікатором виклику, що блокував активність, бажає увійти в активність, входити в неї. На шкода, описів механізм синхронізації не вирішує проблему синхронізації повністю. Блокування при виклику об' єкту з деякої активності встановлюється на рівні процесу. Це означає, що у разі, коли активність включає контексти з декількох процесів, виклики, спрямовані в контексти цієї активності, але що належать різним процесам, можуть виконуватися паралельно. Це може привести до deadlock. Приклад наведень в згаданій вище статті Don Box. Нехай потік X викликає об' єкт A, потік Y викликає об' єкт B, об' єкти A і B належать одній активності, але різним процесам. У цьому випадку виклики можуть виконуватися паралельно. Нехай тепер об' єкт A викликав об' єкт B, а об' єкт B викликав об' єкт A. Виникає deadlock, оскільки ці виклики належать різним ланцюжкам викликів і блокують один одного. Рецепт наступний. Не слід різним клієнтам користуватися одними і тими ж об' єктами -серверами. Кожен клієнт повинні активувати для собі новий об' єкт -сервер. Розділяти слід тільки дані. Їх узгодженість забезпечуватиметься сервісом транзакцій. Розглянувши поняття синхронізації можна поставити питання про роль апартаментів в COM+. Як говорити Don Box, їх роль різко обмежена. Це прив'язка потоків до контекстів і тільки. Дійсно, до шкірного апартаменту окрім NA прив'язаний один (у випадку STA) або декілька (у разі MTA) потоків. Ці потоки можуть викликати будь-який метод будь-якого об' єкту відповідного апартаменту. Методи об' єкту з NA взагалі можуть бути викликані з будь-якого потоку. Механізм синхронізації у COM+ визначає коли потік з апартаменту може викликати метод об' єкту, що живе в деякому контексті цього апартаменту.
Дата добавления: 2014-01-04; Просмотров: 291; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |