Главная » Просмотр файлов » Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)

Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 102

Файл №1160865 Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)) 102 страницаНэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865) страница 1022019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 102)

Тбгеаб[) гпбСЬгеабз = пен ТЬгеаб[ 50 ]; Гог( аапС 1 = 0; 1 < 50; ++1 ) ( гпбСЬгеабя[1] пен Тогеаб( пен ТЬгеабЯСагг( ЕпСгуро1пг.впбТЬгеабгапс) )~ гпбСЬгеабз[1].БСагг()) Обратите внимание, что весь доступ к переменной пощЬегТЬгеас)я производится внутри критической секции в форме объекта блокировки. Перед каждым обращением средство доступа должно получить блокировку на экземпляре объекта СЬе?.осК. Типом поля СЬе).осК является оЬЗесг.

— просто потому, что действительный тип не имеет значения. Единственное, что важно — это ссылочный тип, а не тип значения. Поскольку экземпляр оЬО ес с необходим только для того, чтобы использовать его внутренний блок синхронизации, можно просто создать для этого экземпляр Буз Сею. СЬ] ес С. Многопоточность в С№ 385 Совет. Для подстраховки внутренний объект блокировки можно пометить ключевым словом геабоп1у, как это сделано в приведенном выше коде.

Это предотвратит непреднамеренное присваивание тьеьоск другого экземпляра, что подвергнет риску всю систему. Вероятно, вы заметили еще одну вещь — код выглядит более громоздко, чем в версии, использующей методы 1птег1оскеб, для каждого вызова мопусог. епгег должен гарантированно существовать соответствующий ему вызов моп).тот. ехтт. В примерах применения класса муБртпьоск эта проблема смягчается за счет помещения обращения к методам класса 1птег1осхеб в класс по имени МуБртпьосКМападег. Можете ли вы представить себе хаос, который наступит, если вызов Мол).

Го г. Ех). т будет пропущен иэ-за сгенерированного исключения г Поэтому в таких ситуациях всегда следует применять блок тгу/11па11у. Создатели языка С№ осознавали, что разработчикам придется приложить немало усилий, чтобы обеспечить наличие блоков 11па11у во всех случаях, где нужен вызов мопттог. ех1т. Они облегчили им жизнь, введя ключевое слово 1оск. Рассмотрим тот же пример снова, на этот раз применив ключевое слово 1освп изтпд Бузгеег ия1пд Бузтев.ТЬгеабтпдг риЬ11с с1азз Ептгуротпт ( згагтс рг1чаге геабоп1у оЬ)ест гпеьссх = пен ОЬ)ест()г зтагтс ргтчаге Тпт пимоегТЬгеабз = Ог зтатзс ргтчате Вапбот гпб = пен Вапбоз()) ргтчате зтаттс чотб РлбТЬгеабгипс() ( // Управлять счетчиком потоков и ожидать произвольный // промежуток времени от 1 до 12 секунд.

1осв( ЕЬепосх ) ( ++пшзЬетТЬтеабзг 1пт Гтве = гпб.кехт( 1000, 12000 ); ТЬгеаб.Я1еер( Где )г 1ос)г( ЗЬеЬосв ) ( — пшзЬегТЬгеабз; ) ) ртзчате зтаттс чозб ВрГТЬгеабрипс() ( нЬ11е( ттие ) ( Тпт тпгеабСоипт = 0; 1ос)с( ЕЬедосв ) ( ГЬгеабсоипт = пимЬегТЬгеабяг Сопзо1е.нгттеьапе( "(О) поток(ов) активно", тпгеабСоипт )г ТЬгеаб.Я1еер( 1000 ); ) ) зтат1с чогб Мати() ( // Запустить потоки отчетов. ТЬгеаб терагтег = пен ТЬтеаб( пен ТЬгеабзтатт( Епттуро1пт.крГТЬгеабуипс) ); героггег.1зВаскдтоипб = ггиег героггег.згагт О г 386 Глава (2 // Запустить потоки, ожидающие в течение случайного периода времени.

Тптеаб(] тпстптеабв = пен Тптеаб( 50 ]; Тот( пьпт 1 = Оу 1 < 50; +ат ) ( тпбтптеабв(т] пен Тптеаб( пен ТптеабЯтатт( Епттуро1пт.НпбТЬтеабгопс) тпбтЬтеабз [а] . ятатт (); Обратите внимание, что код стал намного яснее, и явные вызовы методов моп1 тот в нем теперь вообще отсутствуют. "За кулисами" компилятор развертывает ключевое слово 1оск в знакомую конструкцюо тту/Ттпа11у с вызовами Мопьтот. Ептет и Моп1тот.

Ехтт. В этом легко убедиться, просмотрев сгенерированный код ГЬ с помощью ]ЬРАВМ. Во многих случаях синхронизация, реализованная внутренне в пределах класса, также проста, как и реализация критических секций в такой манере. Но когда всем методам класса нужен только один объект блокировки, эту модель можно упростить еще больше, исключив дополнительный объект яузтещ.

ОЬ]ест и используя ключевое слово тп1з при захвате блокировки через класс Моп1тот. данный шаблон использования в коде СЗ встречается часто. Хотя он избавляет от необходимости создания экземпляра объекта яузтещ. Оь] ест, который весьма легковесен, все же он несет в себе некоторые опасности. Например, внешний потребитель объекта может попытаться использовать блок синхронизации внутри объекта, передав его экземпляр в мап] тот . ел те т еще перед вызовом одного из методов, пытающихся захватить ту же блокировку. Формально это разрешено, потому что один и тот же поток может вызывать моп].тот. епест несколько раз. Другими словами, блокировки моп].тот реентерабельны, в отличие от спин-блокировок из предыдущего раздела.

Однако для освобождения блокировки должно быть произведено такое же количество вызовов Мопттот. Ехтт. В этом случае приходится полагаться на потребителя объекта в том. что он применит либо ключевое слово 1ос)с, либо блок тту/11па11у, гарантируя, что каждому вызову мопьтот. ехтт будет соответствовать свой вызов моп1гог. ех1т. Когда возможно, старайтесь избегать подобной неизвестности.

Использовать блокировку через ключевое слово ть1з не рекомендуется. Вместо этого в качестве объекта блокировки лучше применять приватный экземпляр Я узтещ. ОЬб ест. Аналогичного эффекта удалось бы достичь, если бы существовал способ объявить флаг блока синхронизации объекта как ртунате, но, к сожалению, это невозможно. Остерегайтесь улекоеки В случае применения для реализации блокировки методов Моптвот внутренне для управления блокировкой класс мопттот использует блок синхронизации экземпляров объектов.

Поскольку каждый экземпляр объекта потенциально может иметь блок синхронизации, можно использовать любую ссылку на объект, даже ссылку ОЬ] ест на тип значения. Несмотря на такую возможность, никогда не передавайте экземпляр типа значения в мопттот.ептет, как показано в следующем примере кода: пв1пд Яузтетп пэтпО Яузтещ.ТПтеабтпон РОЬ11с с1азз Ептгуротпт ( зтат1с ртгчате 1пт сопптет = 0; // НИКОГДА НЕ ПОСТУПАЙТЕ ТАК!!! зтатбс рттчате Тпт тпепосх = 0; многопоточность з ь(г 387 зтаттс рттчате чотг) Тнтеас)рппс О ( Тот( тпт т = О; 1 < 50; ++1 ) ( Мопттот.Ептет( тнеьост ); тту ( Сопзо1е.итттеЬЬпе( ++пососет ) 11па11у ( Мопттот.Ех1т( тнеЬост ) ) ) ) зтаттс чоЬП Матп() ( Тнтеаг( тьтеэг)1 = пен Тнтеаг(( пен Тнтезг(Беате(ЕпттуРотпт.тнтеаг)Рппс) Тнтезс) тнтезг(2 = пен Тнтеа<)( пен Тнтеаг)зтатт(Епттуротпт.тнтеаг)Рппс) ) тнтеаг(1.Бтатт О г тптезг)2.5татт()г Запустив на выполнение этот код, вы немедленно столкнетесь с исключением Яупсотоп1тат1опЬосКЕхсерт1оп, которое сообщит, что метод объекта синхронизации был вызван из не синхронизированного блока кода.

Почему это случилось? Чтобы ответить на этот вопрос, следует вспомнить, что при передаче типа значения методу, принимающему ссылочный тип, происходит неявная упаковка. К тому же многократная передача одного и того же экземпляра типа значения в один и тот же метод каждый раз в результате дает разные ссылки на упаковку. Поэтому ссылочный объект, используемый внутри тела мопЬтот. ех1т, отличается от того, что используется внутри тела Мопттот.

Ептет. Это еще один пример того, какими неприятностями грозит неявная упаковка в языке СЗ. Возможно. вы заметили, что в данном примере применяется подход на основе тгу/Т).гга11у. Причина в том, что проектировщики языка СЗ создали оператор 1ос)с таким образом, что он не принимает типов значений. Поэтому, если вы привыкли к применению оператора 1ос)с для обработки критических секций, беспокоиться о нечаянной передаче упакованного типа значения методам моп1тог не нужно. РььХае и Ргадй Пользу от методов моп1тот при реализации критических секций трудно преувеличить.

Однако помимо реализации простых критических секций, методы мопз тот обладают и другими возможностями. Их также можно использовать для реализации квитирования ()тапбз)га)т)пф между потоками, а также для реализации поочередного доступа к разделяемым ресурсам. Когда поток успешно входит в блокированную область, он может встретить установленную блокировку и войти в очередь ожидания вызовом одной из перегрузок Монт тот. ИаЬт. Первый параметр Моп1тот. Иэ1т — объектная ссылка, блок синхронизации которой представляет используемую блокировку.

Второй параметр — значение таймаута. Моп1тот. На1т возвращает булевское значение, указывающее на успех ожидания либо завершение его по истечении таймаута. Если ожидание завершилось успешно, возвращается ттце. в противном случае — Рз1зе. Когда поток, вызвавший мопзтот. Кзтт, завершает ожидание успешно, он покидает состояние ожидания как владелец блокировки. Нз заметку! Перегрузки монт тот. Ма1т описаны з документации МЗ()Н. 388 Глава ) 2 Если потоки, столкнувшись с блокировкой, могут войти в состояние ожидания, должен существовать какой-нибудь механизм уведомления Моп1сог, что он может вернуть блокировку обратно одному из ожидающих потоков как можно скорее.

Таким механизмом является метод моп1гог. Рп1яе. Вызвать моп1гог. Рп1яе может только погон, который в данный момент удерживает блокировку. Когда вызывается этот метод, то поток, находящийся первым в очереди олпщающих, перемещается в очередь готовых. Как только поток, владеющий блокировкой, снимает ее — вызовом моптгог. ех1г.

или Мопгсог. Ха11 — то первый поток в очереди готових полУчает разрешение работать. Потоки в очереди готовых включают помещенные с помощью Рп1яе и те, что были заблокированы после вызова Моп).сот. Епсег. Вдобавок поток, владеющий блокировкой, вызовом моп1гог. Рп1яел11 может переместить все ожидающие потоки в очередь готовых. Существует много причудливых задач синхронизации, которые можно решать с использованием методов моп1гог.

Характеристики

Тип файла
DJVU-файл
Размер
8,22 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Нэш Трей - C# 2010
Accelerated_C_2010-4565
3_syntax_overview
3_generics_1.cs
as_1.cs
boxing.cs
conversions_1.cs
implicit_type_1.cs
is_1.cs
references_1.cs
references_2.cs
references_3.cs
values_1.cs
4_classes_structs
4_abstract_classes_1.cs
4_beforefieldinit_1.cs
4_box_1.cs
4_box_2.cs
4_box_3.cs
4_box_4.cs
4_box_5.cs
4_class_definition_1.cs
4_compareto_1.cs
4_containment_example_1.cs
4_containment_example_2.cs
4_containment_example_3.cs
4_ctor_struct_1.cs
4_ctor_struct_2.cs
4_ctor_struct_3.cs
4_destructor_1.cs
4_destructor_2.cs
Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7029
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее