Главная » Просмотр файлов » Г. Шилдт - С#4.0 Полное руководство

Г. Шилдт - С#4.0 Полное руководство (1160795), страница 171

Файл №1160795 Г. Шилдт - С#4.0 Полное руководство (Г. Шилдт - С#4.0 Полное руководство) 171 страницаГ. Шилдт - С#4.0 Полное руководство (1160795) страница 1712019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Класс могШое и блокировка Ключевое слово 1ос)г на самом деле служит в СФ быстрым способом доступа к средствам синхронизации, определенным в классе Моппсог, который находится в пространстве имен зу в гегп. тьге а с(1по. В этом классе определен, в частности, ряд методов для управления синхронизацией. Например, для получения блокировки объекта вызывается метод Епгег (), а для снятия блокировки — метод Ех1Ь () . Ниже приведены общие формы этих методов: рвЫ1е всаг1с подо Елгег(оЬЗесс ебп) риЫьс вгасьс во16 Ек1Г(оЬЗесс оЬу) где обз обозначает синхронизируемый объект. Если же объект недоступен, то после вызова метода Епгех () вызывающий поток ожидает до тех пор, пока объект не станет доступным.

Тем не менее методы Епбег () и Ехзс () применяются редко, поскольку оператор 1оск автоматически предоставляет эквивалентные средства синхронизации потоков. Именно поэтому оператор 1оск оказывается "более предпочтительным" для получения блокировки объекта при программировании на Сй. Впрочем, один метод из класса мопьсог может все же оказаться полезным.

Это метод ТгуЕпсег (), одна из общих форм которого приведена ниже. рвЫьс вгапгс Ьоо1 тгуппгег(оЬЗесг еЬу) Этот метод возвращает логическое значение Ь где, если вызывающий поток получает блокировку для объекта ЬЬт', а иначе он возвращает логическое значение Еа1ве. Но в любом случае вызывающему потоку придется ждать своей очереди.

С помощью метода тгуепсег () можно реализовать альтернативный вариант синхронизации потоков, если требуемый объект временно недоступен. Кроме топь в классе моп1сог определены методы хапс (), Рц1зе () и РЬ1зел11 (), которые рассматриваются в следующем разделе. Сообщение между потоками с помощью методов Иах1(),Ри1ее() и Ри1веА11() Рассмотрим следующую ситуацию.

Поток т выполняется в кодовом блоке 1ос)с, и ему требуется доступ к ресурсу )(, который временно недоступен. Что же тогда делать потоку Т? Если поток Т войдет в организованный в той или иной форме цикл опроса, ожидая освобождения ресурса Е, то тем самым он свяжет соответствующий объект, блокируя доступ к нему других потоков. Это далеко не самое оптимальное решение, поскольку оно лишает отчасти преимуществ программирования для многопоточной 856 Часть П. Библиотека С№ среды.

Более совершенное решение заключается в том, чтобы временно освободить объект и тем самым дать возможность выполняться другим потокам. Такой подход основывается на некоторой форме сообщения между потоками, благодаря которому один поток может уведомлять другой о том, что он заблокирован и что другой поток может возобновить свое выполнение. Сообщение между потоками организуется в С)( с помощью методов Иа№С (), Ри1зе () и Ри1зеА11 () . Методы Иа№с (), Ри1зе () и Ри1зеА11 () определены в классе Мопьсог и могут вызываться только из заблокированного фрагмента блока.

Они применяются следующим образом. Когда выполнение потока временно заблокировано, он вызывает метод Иаьг ( ) . В итоге поток переходит в состояние ожидания, а блокировка с соответствующего объекта снимается, что дает возможность использовать этот объект в другом потоке. В дальнейшем ожидающий поток активизируется, когда другой поток войдет в аналогичное состояние блокировки, и вызывает метод Ри1зе () или Ри1зеА11 () . При вызове метода Ри1зе () возобновляется выполнение первого потока, ожидающего своей очереди на получение блокировки. А вызов метода Ри1зеА11 () сигнализирует о снятии блокировки всем ожидающим потокам.

Ниже приведены две наиболее часто используемые формы метода Иа1С () . риЬ1гс зсагьс Ьпо1 Хаас (оЬзесг аЬ№) риЬ) ьс згагьс Ьсе1 Иаьс(оЬЗесг оЬ№, 1пс миллисекунд простоя) В первой форме ожидание длится вплоть до уведомления об освобождении объекта, а во второй форме — как до уведомления об освобождении объекта, так и до истечения периода времени, на который указывает количество миллисекунд простоя.

В обеих формах оЬ) обозначает объект, освобождение которого ожидается. Ниже приведены общие формы методов Ри1зе () и Ри1зеА11 (): риЬ11с згасьс чогг) Ри1зе(оЬЗесг оЬ№) риЬ11с згагьс чогг) Ри1зеА11(оЬЗесг аЬ№) где оьт' обозначает освобождаемый объект. Если методы иаьс (), Ри1зе () и Ри1зеА11 () вызываются из кода, находящегося за пределами синхронизированного кода, например из блока 1осК, то генерируется исключение Яупспгоп1ваг1опЕосКЕхсерггоп.

Пример использования методов тгтаЫ () и 1))11ве () Для того чтобы стало понятнее назначение методов Иа№С () и Ри1зе (), рассмотрим пример программы, имитирующей тиканье часов и отображающей этот процесс на экране словами "тик" и "так". Для этой цели в программе создается класс ТьсКТосК, содержащий два следующих метода; Т№сК() и тосЕ().

Метод ТьсК() выводит на экран слово "тик", а метод ТосЕ () — слово "так". Для запуска часов далее в программе создаются два потока: один из них вызывает метод Тьсх ( ), а другой — метод ТосК () . Преследуемая в данном случае цель состоит в том, чтобы оба потока выполнялисгь поочередно выводя на экран слова "тик" и "так", из которых образуется повторяющийся ряд "тик-так", имитирующий ход часов: // Использовать методы Иаьг() и Ри1зе() для имитации тиканья часов.

изьпд Зузсеги изьпп Яузгез.ТЬгеас(1пд; Глава 23. Многопоточное программирование. Часть первап: основы 887 с1аяя Т1с)стоп)с ( оЬтесг 1ос)сОп = пен оЬ)есг(); рчЫТс чогб Т1с)с(Ьоо1 гппп1по) ( 1ос)с(1ос)соп) ( гг(!гиппапд) ! // остановить часы 'Мопггог.рс1яе(1осКОп)) // уведомить любые ожидавшие потоки геснгп; ) Сопяо1е.нггье ("тик "); Моп1Сог.рч1яе(1оссбп)) // разрешить выполнение метода Тос)с() Моп1Сог.на1с(1ос)сОп)г // ожидать завершения метода Тос)с() ) рсЫТс нога Тос)с(Ьоо1 гппп1пст) ( 1ос)с (1ос)сОп) ( 15()гопп1пс) ( // остановить часы Мопсгог.Ро1яе(1осКОп)с // уведомить любые ожидаюцие потоки гесогп; сопяо1е.иг1сеьгпе("так"); Мопгяог.ри1яе(1ос)сбп); // разрешить выполнение метода Тсс)с() моп1сог.иа1с(1ос)соп)с // ожипать завершения метода т1с)с() ) ) ) с1аяя МуТЬгеаб ( рпЫгс Тпгеаб ТЬгс(; Т1с)стоп)с ССОЬ; О Сконструировать новый поток. роЬ11с Мутпгеаб(ягг1пс паве, Т1с)стоп)с СС) ( Тпгб = пен ТЬгеаб(СЫя.Кип); ССОЬ = Сгг ТЬгб.паве = павес тпгб.ягагС()) ) Начать выполнение нового потока.

чотб Ноп() ( 11(ТЬгс(.паве == "Т1с)с") ( Гог(1пг г=о) 1<5) 1++) ССОЬ.Т1с)с(ггое); ССОЬ.Т1с)с(та1яе)с ) е1яе ( Рог(1пг г=о; г<5; 1++) ССОЬ.тос)с(ггсе)с ССОЬ.тес)с(га1яе); ) ) 858 Часть ((. Библиотека С() с1аяя ТгсиьпЧС1осК ( ясас1с ното Магд() ( ТгсКТосх ГГ = пеи ТгсКТосК(); Мутпгеаб шс1 = пен Мутпгеао("Т1сК", ГГ); Мутпгеао шс2 = пеи Мутпгеаб("Тосх", ГС); шсг.тпго.по1п(); шСТ.ТЬго. Уогп(); Сопяо1е.иггсеыпе("Часы остановлены" ); Ниже приведен результат выполнения этой программы. тик так тик так тик так тик так тик так Часы остановлены Рассмотрим эту программу более подробно. В методе ма1п () создается объект ьь типа Т1сКТосК, который используется для запуска двух потоков на выполнение. Если в методе Нпп () из класса МуТЬгеас( обнаруживается имя потока Т1сК, соответствующее ходу часов "тик", то вызывается метод Т1 с К () .

А если это имя потока Тос К, соответствующее ходу часов "так", то вызывается метод Тосх () . Каждый из этих методов вызывается пять раз подряд с передачей логического значения Ьгпе в качестве аргумента. Часы идут до тех пор, пока этим методам передается логическое значение Ьгпе, и останавливаются, как только передается логическое значение Та1яе. Самая важная часть рассматриваемой здесь программы находится в методах Т1сК () и Тосх () . Начнем с метода ТТсК (), код которого для удобства приводится ниже. рпэтгс чоьо Тгсх(ооо1 гппп1пч) 1осК(1осКОП) ( 1Г(!гппп1пч) ( // остановить часы Мопгсог.рп1яе(1осхоп); /У уведомить любые ожидагшие потоки гегпгп; ) Сопяоге.иг1ге("тик "); Мопгсог.Рп1яе(1осКОп); // разрешить выполнение метода ТосК() моп1гог.ха1г(1оскоп); // ожидать завершения метода тосе() Прежде всего обратите внимание на код метода Т1сК () в блоке 1осК.

Напомним, что методы Иа11 () и Рп1яе () могут использоваться только в синхронизированных блоках кода. В начале метода Тг с К () проверяется значение текущего параметра, которое служит явным признаком остановки часов. Если это логическое значение Та1яе, то часы остановлены. В этом случае вызывается метод Рп1яе (), разрешающий выполнение любого потока, ожидающего своей очереди. Мы еще вернемся к этому моменту в дальнейшем. Если же часы идут при выполнении метода т1сК (), то на экран выводится слово "тик" с пробелом, затем вызывается метод Рп1яе (), а после него — метод Глава 23.

Многопоточное программирование. Часть первая: основы 859 Хагг () . При вызове метода Ри1зе () разрешается выполнение потока для того же самого объекта, а при вызове метода Ха11 () выполнение метода Т1сК () приостанавливается до тех пор, пока метод Рн1зе () не будет вызван из другого потока. Таким образом, когда вызывается метод Тзск (), отображается одно слово "тик" с пробелом, разрешается выполнение другого потока, а затем выполнение данного метода приостанавливается. Метод Тоск () является точной копией метода Тйск (), за исключением того, что он выводит на экран слово "так". Таким образом, при входе в метод Тоск () на экран выводится слово "так", вызывается метод Рп1не (), а затем выполнение метода Тоск () приостанавливается. Методы ТгсК () и ТосК () можно рассматривать как поочередно сменяющие друг друга, т.е. они взаимно синхронизированы. Когда часы остановлены, метод Рп1зе () вызывается для того, чтобы обеспечить успешный вызов метода хаас () .

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

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

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

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6376
Авторов
на СтудИзбе
309
Средний доход
с одного платного файла
Обучение Подробнее