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

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

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

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

Именно поэтому вызов Бцзрепс1 позволяет потоку достичь безопасной точки, прежде чем поток в действительности будет приостановлен. Также необходимо подчеркнуть, что никогда не следует применять БцэрепсГ и Еезцае для управления синхронизацией. Разумеется, тот факт, что система позволяет потоку продолжать выполнение до достижения безопасной точки — достаточно веская причина полагаться на этот механизм, но, тем не менее, это — плохая практика дизайна. 368 Глава 12 Ожидание завершения потока В предшествующих примерах настоящей главы метод,тобо использовался для ожидания завершения определенного потока.

Фактически именно для этого он и предназначен. В неуправляемом приложении 1)у(п32, возможно, вы привыкли ожидать, пока дескриптор потока не даст сигнал о завершении потока. Метод Зо1п на самом деле реализует тот же механизм. Имя метода отражает тот факт, что путь выполнения текущего потока присоединяется к пути выполнения того потока, на котором вызван,уо1п, и работа не может быть продолжена, пока это соединение не произойдет. Естественно, вы захотите избежать вызова Яобп на текущем потоке.

Эффект от этого подобен вызову Я па репб из текущего потока — поток блокируется до тех пор. пока не будет прерван. Даже когда поток блокируется вызовом,то1п, он может быть разбужен вызовом 1псеггпрс или ЛЬогс, как было описано в предыдущем разделе. Иногда "оуп будет вызываться для ожидания завершения другого потока, но наверняка не захочется ждать вечно. Для Тоуп предусмотрены перегрузки, позволяющие определять время ожидания. Эти перегрузки возвращают булевское значение, причем сгие означает, что поток был остановлен, а га1зе свидетельствует об окончании таймаута.

Потоки переднего плана и фоновые потоки После создания потока в управляемой среде .)()ЕТ по умолчанию он существует как поток переднего плана. Это значит, что управляемая среда выполнения. а с ней и процесс, останутся активными до тех пор, пока активен этот поток. Рассмотрим следующий код; паунд Яузгеш; паунд Яувсеш.ТЬгеаб1пзн рпЬ11с с1авв ЕпсгуРо1пс ( ргучасе згасус чо1б ТЬгеабуопс1() ( ТЬгеаб.Я1еер( 5000 Сопво1е.нг1сеь(пе( "Завершение дополнительного потока" ) ) всасус чоуб На1п() ТЬгеаб СЬгеаб1 = лен ТЬгеаб( пен ТЬгеабЯГагс(ЕпсгуРоупС.ТЬгеабуопс1) ) Спгеаб1.ЯГагс()) Сопво1е.игусеьбпе( "Завершение главного потока" Запустив этот код, вы увидите, что Иауп завершится до завершения дополнительного потока, как видно из следующего вывода; Завершение главного потока Завершение дополнительного потока Разработчики С++ здесь обнаружат отличие от поведения, к которому они привыкли, где процесс обычно прерывается, как только завершается главная процедура приложения.

Временами может потребоваться, чтобы процесс был завершен, когда завершается главный поток, несмотря на наличие дополнительных фоновых потоков. Чтобы во время выполнения превратить дополнительный поток в фоновый, необходимо установить свойство ТЬгеаб. 1звасупгоппб в Сгпе. Это может понадобиться для потоков. выпол- Многопоточность в С() 369 няющих такую задачу, как прослушивание порта для сетевых соединений, или другую подобную фоновую задачу. Однако имейте в виду, что всегда нужно иметь уверенность, что потоки получат шанс убрать эа собой перед тем, как будут завершены.

Когда фоновый поток завершается по завершении процесса, он не принимает исключений, как в случае. когда кто-то вызовет 1пгеттпрг нли ЛЬотг. Поэтому, если поток работает с постоянно хранящимися данными, которые находятся в каком-то промежуточном состоянии, то его останов определенно плохо на них отразится. Таким образом. создавая фоновые потоки, удостоверьтесь, что они закодированы с учетом того, что могут быть грубо прерваны в любой момент, и это не вызовет никаких катастрофических последствий.

Также можно реализовать некоторый механизм уведомления потока о том. что процесс собирается его скоро прервать. Такой механизм привносит дополнительную сложность, поскольку после отправки уведомления дополнительному потоку главный поток должен будет ждать в течение определенного времени, предоставляя дополнительному потоку возможность выполнить работу по очистке. В втой точке вполне разумно превратить поток обратно в поток переднего плана. Локальное хранилище потока В управляемом окружении можно создавать локальное хранилище потока (ЬЬгеаб(оса) вгогаяе — ТЬЯ). В зависимости от приложения, может понадобиться иметь статическое поле класса, уникальное для каждого потока, в котором используется класс.

В большинстве случаев на СЗ сделать это очень просто. Статическое поле, которое должно быть привязано к потоку, нужно просто снабдить атрибутом ТЬтеабБгаггсАггт1Ьпге. После этого поле будет инициализировано отдельно для каждого потока, обращающегося к нему.

"За кулисами" каждый поток получает собственное связанное с ним место хранения значения или ссылки. Однако при использовании ссылок на объекты будьте осторожны, выдвигая предположения о создании объектов. В приведенном ниже коде демонстрируется возможная ловушка, которой следует избегать: ов1пч Яувгеш; оябпч Яуягеш.ТЬтеаб1пд) ряЬ1то с1авв ТЬБС1авв ( рпЫтс ТЬЯС1аяя () ( Сопяо1е.нтьгеЬЬпе ( "Создание ТЬЯС1авя" ) ) риЫтс с1аяя ТЬЯГ1е1б01аяв ( (ТЬтеабЯгагбс) роЬ1то ягаг1с тЬБС1аяв г1вбага = пен тЬЯС1авв() ) риЫ1с с1авя Епгтугоапг ( рт1ваге ягагьс вогд ТЬтеабгппс О ( Сопво1е.нттгеььпе( "Поток (О) запускается...", ТЬтеаб.спттепгТЬтеаб.МападебТЬтеаб1б ); Сопяо1е.ХттгеЬ1пе( "г1ябага для этого потока — 1"(0)1"" тЬБГЬе1бС1авя.г1ябага ) Сопяо1е.нтггеЬ1пе( "Поток (О) завершается", ТЬтеаб.спттепгТЬтеаб.иападебТЬтеаб1б ); 370 Глава 12 зсаггс нобб Мабп() ( Тпгеаб Гнгеаб1 = пвн Тпгеаб( пен Тпгеабзсагс(ЕпсгуРотпГ.ТПгеабрипс) ) Тпгеаб Гпгеаб2 = пен Тсгеэб( пен Тлгеабзсагс(ЕпсгуРо1пс.тлгеэбгппс) ) тсгеаб1.ЯГэгк О г гпгеэб2.Бгагг П г В коде создаются два потока, которые обращаются к связанному с потоком статическому члену Т1,БРТе1бС1азз, Чтобы проиллюстрировать ловушку, присутствующую в коде, предусмотрен специфичный для потока элемент типа ТПБС1азз, который код пытается инициализировать с помощью инициализатора в определении класса, просто вызывающего пен с конструктором по умолчанию.

Теперь посмотрите, насколько неожиданный вывод получается: Поток 3 запускается... Поток 4 запускается... Создание ТЬЯС1азз г1збагз лля этого потока — "тьзс1эзз" Поток 3 завершается Г1збага лля этого потока — "" Поток 4 завершается Внимание( Помните, что последовательность выполнения многопоточных программ никогда не гарантирована, если только не применяются специальные механизмы синхронизации.

Показанный выше вывод был сгенерирован на однопроцессорной системе. Если запустить эта приложение на многопроцессорной системе, скорее всего, в выводе окажется совершенно другая последовательность. Тем не менее, смысл приведенного примера не меняется. Важный момент, который следует здесь отметить: конструктор Т1.БС1азз вызывался лишь однажды.

Конструктор был вызван для первого потока, но не для второго. Во втором потоке поле инициализируется значением пп11. Поскольку поле г1збага является статическим, его инициализация в действительности производится в момент вызова статического конструктора Т1,БРТе1бС1азз, Однако статические конструкторы могут быть вызваны только один раз для одного класса в одном домене приложений.

По этой причине следует избегать присваивания значений элементам, связанным с потоком, в точке объявления. Таким образом. они всегда будут получать значения по умолчанию. Для ссылочных типов это означает пи11, а для типов значений — эквивалент установки всех бит хранилища в О, При первом доступе к специфичному для потока элементу его можно проверять на равенство пп11 и соответствующим образом создавать экземпляр.

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

Вы обнаружите, что статический метод будет вызван только однажды. Если бы среда СЬВ попыталась "исправить" эту проблему, она стала бы без сомнения менее эффективной, поскольку пришлось бы проверять, осуществляется ли доступ к полю первый раз, и если это так — вызывать код инициализации. Если вы задумаетесь об этом, то поймете, что все намного сложнее, чем кажется на первый взгляд. Существует и другой способ организации локального хранилища потока, не предполагающий декорирование статической переменной атрибутом.

Локальное хранилище пото- Многопоточность в С» 371 каможно распределятьдинамнчески,используялибометод тьгеаб.А11осасецаса51ос, либо тЬгеаб.А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 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7054
Авторов
на СтудИзбе
259
Средний доход
с одного платного файла
Обучение Подробнее