Главная » Просмотр файлов » С. Мейерс - Эффективный и современный C++

С. Мейерс - Эффективный и современный C++ (1114942), страница 64

Файл №1114942 С. Мейерс - Эффективный и современный C++ (С. Мейерс - Эффективный и современный C++) 64 страницаС. Мейерс - Эффективный и современный C++ (1114942) страница 642019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

:...e.r.s>!!'��e Вызываемая ·вызова ,функция(обыч но) функцияСуществование общего состояния имеет важное значение, потому что поведение де­структора фьючерса - тема этого раздела - определяется общим состоянием, связан­ным с этим фьючерсом. В частности, справедливо следующее.•Деструктор последнеrо фьючерса, ссылающеrося на общее состояние для неотло­женной задачи, запущенной с помощью std : : async, блокируется до тех пор, показадача не будет завершена. По сути, деструктор такого фьючерса неявно выполняетj o i n для потока, асинхронно выполняющего задачу.•Деструкторы всех прочих фьючерсов просто уничтожают объект фьючерса.

Дляасинхронно выполняющихся задач это сродни неявному отключению базового по­тока с помощью вызова detach. Для отложенных задач, для которых данный фью­черс является последним, это означает, что отложенная задача никогда не будет вы­полнена.Эти правила выглядят сложнее, чем есть на самом деле. Мы имеем дело с простым"нормальным" поведением и одним исключением. Нормальное поведение заключаетсяв том, что деструктор фьючерса уничтожает объект фьючерса. Вот и все. Он ничего неподключает, ничего не отключает, он ничего не запускает. Он просто уничтожает чле­ны-данные фьючерса. (Ну, на самом деле он делает еще одно дело - уменьшает значе­ние счетчика ссылок общего состояния, которое управляется как ссылающимися на негофьючерсами, так и объектами std : : promi se вызываемой функции. Этот счетчик ссылокпозволяет библиотеке знать, когда можно уничтожать общее состояние.

Информациюпо счетчикам ссылок вы можете найти в разделе 4.2.)Исключение из этого нормального поведения осуществляется только для фьючерса,для которого выполняются все перечисленные далее условия.262•Он ссылается на общее состояние, созданное вызовом std : : async.•Стратегия запуска задачи - std : : l aunch : : a sync (см. раздел 7.2), либо потому, чтоона выбрана системой времени выполнения, либо потому, что была явно указанав вызове std : : async.•Фьючерс является последним фьючерсом, ссылающимся на общее состоя­ние.

Это всегда справедливо для s t d : : fu t u re . Для s t d : : sha red_fu ture, еслипри уничтожении фьючерса на то же самое общее состояние ссылаются другиеstd : : shared_ future, поведение уничтожаемого фьючерса - нормальное (т.е. про­сто уничтожаются его члены-данные).Гnава 7 . Пара nnеn ьные вычисnенияТолько когда все эти условия выполнены, деструктор фьючерса демонстрирует особоеповедение, и это поведение состоит в блокировке до тех пор, пока не будет завершенаасинхронно выполняющаяся задача. С практической точки зрения это равносильно неяв­ному вызову j o i n для потока с запущенной задачей, созданной с помощью std : : async.Часто приходится слышать, что это исключение из нормального поведения деструк­тора фьючерса резюмируется как "Фьючерс из std : : a s ync блокируется в своем деструк­торе': В качестве первого приближения это так, но иногда нам надо что-то большее, чемпервое приближение. Теперь вы знаете правду во всей ее красе и славе.Ваше удивление может принять и иную форму.

Например, "Не понимаю, почему име­ется особое правило для общих состояний для неотложенных задач, запущенных с помо­щью std : : a sync': Это разумный вопрос. Я моrу сказать, что Комитет по стандартизациихотел избежать проблем, связанных с неявным вызовом det ach (см. раздел 7.3), но нехотел одобрять такую радикальную стратегию, как обязательное завершение програм­мы (как сделано для подключаемых s t d : : t hread; см.

тот же раздел 7.3), так что в ка­честве компромисса был принят неявный вызов j oi n . Это решение не без противоре­чий, и были серьезные предложения отказаться от этого поведения в С++ 14. В концеконцов никакие изменения сделаны не были, так что поведение деструкторов фьючерсовв С++ l l согласуется с таковым в С++ 14.API для фьючерсов не предлагает способа определения, ссылается ли фьючерс на об­щее состояние, возникающее из вызова std : : as ync, так что невозможно узнать, будет лизаблокирован некоторый объект фьючерса в своем деструкторе для ожидания заверше­ния асинхронно выполняющейся задачи. Это имеет некоторые интересные последствия./ / Этот контейнер может блокироваться в деструкторе , поскольку11 один или несколько содержащихся в нем фьючерсов могут// ссьu�аться на общее состояние неотложенного задания,11 запущенного с помощью std: : аsупсs td : : vector<std: : future<void>> fut s ; // Cм .

s td : : future<void>11 в разделе 7 . 5class Widget1 1 Объекты Widget могут/ / блокироваться в ихpuЬlic :/ / деструкторахprivate :std : : shared future<douЫe> fut ;);Конечно, если у вас есть способ узнать, что данный фьючерс не удовлетворяет ус­ловиям, приводящим к специальному поведению деструктора (например, в силу логи­ки программы), вы можете быть уверены, что этот фьючерс не приведет к блокировкедеструктора. Например, претендовать на особое поведение могут только общие состо­яния, получающиеся в результате вызовов s t d : : a s ync, но есть и иные способы созда­ния этих общих состояний.

Один из них - использование s t d : : packaged_tas k. Объектs t d : : packaged t a s k подготавливает функцию (или иной вызываемый объект) к асин­хронному выполнению, "заворачивая" ее таким образом, что ее результат помещается7 .4. Помните о ра э ном поведении деструкторов дескрипторов потоков263в общее состояние. Фьючерс, ссылающийся на это общее состояние, может быть полученс помощью функции get_future объекта s t d : : pa c kaged_t a s k.int calcValue ( ) ;std: : packaged task<int ( ) >pt ( calcValue ) ;auto fut = pt . get_future ( ) ;_/ / Выполняемая функция1 1 Заворачивание calcValue для1 1 асинхронного вьmолнения/ / Получение фьючерса для ptэтой точке мы знаем, что фьючерс fut не ссылается на общее состояние, созданноевызовом s t d : : a sync, так что его деструктор будет вести себя нормально.Будучи созданным, объект pt типа s t d : : packaged_t a s k может быть запущен в пото­ке.

(Он может быть запущен и с помощью вызова s t d : : a sync, но если вы хотите выпол­нить задачу с использованием std : : a s ync, то нет смысла создавать s t d : : pac kaged_ t a s k,поскольку std : : as ync делает все, что делает s t d : : packaged_t a s k до того, как планиров­щик начинает выполнение задачи.)Объекты s t d : : packaged_tas k не копируются, так что когда pt передается в конструк­тор s t d : : thread, он должен быть приведен к rvalue (с помощью s t d : : rnove; см.

раздел 5.1):Вstd : : thread t ( s td : : rnove ( pt ) ) ;1 1 Вьmолнение pt потоком tЭтот пример дает некоторое представление о нормальном поведении деструкторовфьючерсов, но его легче увидеть, если собрать весь код вместе в одном блоке:1 1 Начало блокаstd: : packaged_task<int ( ) >pt ( ca lcValue ) ;auto fut = pt . get_future ( ) ;std : : thread t ( std: : rnove (pt ) ) ;11 См . ниже1 1 Конец блокаНаиболее интересный код скрывается за троеточием " ... ", следующим за созданиемобъекта t типа s t d : : t hread и предшествующим концу блока. Имеются три основныевозможности.С t ничего не происходит.

В этом случае t в конце области видимости будет непод­•ключаемым. Это приведет к завершению программы (см. раздел 7.3).•Для t вызывается функция-член j oin. В•Для t вызывается функция-член detach. В этомэтом случае фьючерсу fut не требуетсяблокировать деструктор, так как вызов j o i n уже имеется в вызывающем коде.случае фьючерсу fut не требуетсявызывать detach в деструкторе, поскольку вызывающий код уже сделал это.Другими словами, когда у вас есть фьючерс, соответствующий общему состоянию,получившемуся из-за применения s t d : : pa ckaged_t a s k, обычно не требуется приниматьспециальную стратегию деструкции, так как решение о прекращении выполнения про­граммы, подключении или отключении потока принимается в коде, работающем с пото­ком s t d : : t hread, в котором выполняется s t d : : packaged_t as k.264Глава 7.

Параллельные вычисленияСледует за помнить•Деструкторы фьючерсов обычно просто уничтожают данные-члены ф ьючерсов.•Последний фьючерс, ссылающийся на общее состояние неотложенной задачи, запу­щенной с помощью std : : a sync, блокируется до завершения этой задачи.7 S Применяйте фьючерсы voidдnя одноразовы х сообщений о событиях..Иногда требуется, чтобы одна задача могла сообщить друтой, выполняющейся асин­хронно, о том, что произошло некоторое событие, поскольку вторая задача не можетпродолжать работу, пока это событие не произойдет. Например, пока не будет инициа­лизирована структура данных, не будет завершено некоторое вычисление или не будетобнаружен сигнал от датчика.

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

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

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

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