Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - [45]
Экземпляры >std::shared_future, ссылающиеся на некоторое асинхронное состояние, конструируются из экземпляров >std::future, ссылающихся на то же состояние. Поскольку объект >std::future не разделяет владение асинхронным состоянием ни с каким другим объектом, то передавать владение объекту >std::shared_future необходимо с помощью >std::move, что оставляет >std::future с пустым состоянием, как если бы он был сконструирован по умолчанию:
>std::promise
>std::future(1) Будущий результат f
>assert(f.valid()); действителен
>std::shared_future
>assert(!f.valid());←(2) f больше не действителен
>assert(sf.valid());←(3) sf теперь действителен
Здесь будущий результат >f в начальный момент действителен >(1), потому что ссылается на асинхронное состояние обещания >p, но после передачи состояния объекту >sf результат >f оказывается недействительным (2), a >sf — действительным (3).
Как и для других перемещаемых объектов, передача владения для r-значения производится неявно, поэтому объект >std::shared_future можно сконструировать прямо из значения, возвращаемого функцией-членом >get_future() объекта >std::promise, например:
>std::promise(1) Неявная передача владения
>std::shared_future
Здесь передача владения неявная; объект >std::shared_future<> конструируется из r-значения типа >std::future(1).
У шаблона >std::future есть еще одна особенность, которая упрощает использование >std::shared_future совместно с новым механизмом автоматического выведения типа переменной из ее инициализатора (см. приложение А, раздел А.6). В шаблоне >std::future имеется функция-член >share(), которая создает новый объект >std::shared_future и сразу передаёт ему владение. Это позволяет сделать код короче и проще для изменения:
>std::promise<
> std::map
> SomeAllocator>::iterator> p;
>auto sf = p.get_future().share();
В данном случае для >sf выводится тип >std::shared_future, такое название произнести-то трудно. Если компаратор или распределитель изменятся, то вам нужно будет поменять лишь тип обещания, а тип будущего результата изменится автоматически.
Иногда требуется ограничить время ожидания события — либо потому что на время исполнения некоторого участка кода наложены жесткие ограничения, либо потому что поток может заняться другой полезной работой, если событие долго не возникает. Для этого во многих функциях ожидания имеются перегруженные варианты, позволяющие задать величину таймаута.
4.3. Ожидание с ограничением по времени
Все блокирующие вызовы, рассмотренные до сих пор, приостанавливали выполнение потока на неопределенно долгое время — до тех пор, пока не произойдёт ожидаемое событие. Часто это вполне приемлемого в некоторых случаях время ожидания желательно ограничить. Например, это может быть полезно, когда нужно отправить сообщение вида «Я еще жив» интерактивному пользователю или другому процессу или когда ожидание действительно необходимо прервать, потому что пользователь устал ждать и нажал Cancel.
Можно задать таймаут одного из двух видов: интервальный, когда требуется ждать в течение определённого промежутка времени (к примеру, 30 миллисекунд) или абсолютный, когда требуется ждать до наступления указанного момента (например, 17:30:15.045987023 UTC 30 ноября 2011 года). У большинства функций ожидания имеются оба варианта. Варианты, принимающие интервальный таймаут, оканчиваются словом >_for, а принимающие абсолютный таймаут — словом >_until.
Например, в классе >std::condition_variable есть по два перегруженных варианта функций-членов >wait_for() и >wait_until(), соответствующие двум вариантам >wait() — первый ждет поступления сигнала или истечения таймаута или ложного пробуждения, второй проверяет при пробуждении переданный предикат и возвращает управление, только если предикат равен >true (и условной переменной поступил сигнал) или истек таймаут.
Прежде чем переходить к детальному обсуждению функций с таймаутами, рассмотрим, как в С++ задается время, и начнем с часов.
4.3.1. Часы
С точки зрения стандартной библиотеки С++, часы — это источник сведений о времени. Точнее, класс часов должен предоставлять четыре элемента информации:
• текущее время now;
• тип значения для представления времени, полученного от часов;
• величина такта часов;
• признак равномерного хода времени, такие часы называются стабильными.
Получить от часов текущее время можно с помощью статической функции-члена >now(); например, функция >std::chrono::system_clock::now() возвращает текущее время по системным часам. Тип точки во времени для конкретного класса часов определяется с помощью члена >typedef time_point, поэтому значение, возвращаемое функцией >some_clock::now() имеет тип >some_clock::time_point.
Тактовый период часов задается в виде числа долей секунды, которое определяется членом класса >typedef period; например, если часы тикают 25 раз в секунду, то член >period будет определён как
Это знаменитый бестселлер, который научит вас использовать власть массового сотрудничества и покажет, как применять викиномику в вашем бизнесе. Переведенная более чем на двадцать языков и неоднократно номинированная на звание лучшей бизнес-книги, "Викиномика" стала обязательным чтением для деловых людей во всем мире. Она разъясняет, как массовое сотрудничество происходит не только на сайтах Wikipedia и YouTube, но и в традиционных компаниях, использующих технологии для того, чтобы вдохнуть новую жизнь в свои предприятия.Дон Тапскотт и Энтони Уильямс раскрывают принципы викиномики и рассказывают потрясающие истории о том, как массы людей (как за деньги, так и добровольно) создают новости, изучают геном человека, создают ремиксы любимой музыки, находят лекарства от болезней, редактируют школьные учебники, изобретают новую косметику, пишут программное обеспечение и даже строят мотоциклы.Знания, ресурсы и вычислительные способности миллиардов людей самоорганизуются и превращаются в новую значительную коллективную силу, действующую согласованно и управляемую с помощью блогов, вики, чатов, сетей равноправных партнеров и личные трансляции.
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
Автор книги — американский специалист по программированию, один из руководителей фирмы IBM, в своей книге делает попытку изложить общие проблемы создания программного обеспечения, его сопровождения и использования. Особенно подробно рассматриваются все фазы разработки программ разных типов. Изложение ясное, удачно иллюстрировано примерами.Для программистов разной квалификации и пользователей ЭВМ.fb2: ВНИМАНИЕ. В тексте присутствуют таблицы. Рекомендуется читать файл с помощью программы, поддерживающей их отображение.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Система сборки программ, используемая во FreeBSD, имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах?
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.