Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - [199]

Шрифт
Интервал

равно >true.

Результат

Сохраняет >e в асинхронном результате, ассоциированном с >*this. Планирует перевод ассоциированного асинхронного результата в состояние готовности в момент завершения потока.

Постусловия

Асинхронный результат, ассоциированный с >*this, содержит исключение, но не является готовым до завершения текущего потока. Все потоки, ожидающие асинхронного результата, будут разблокированы, когда текущий поток завершится. Исключения

Исключение типа >std::future_error с кодом ошибки >std::future_errc::promise_already_satisfied, если в асинхронном результате уже находится значение или исключение.

Синхронизация

Обращения к >set_value(), >set_value_at_thread_exit(), >set_exception() и >set_exception_at_thread_exit() сериализуются. Успешное обращение к >set_value() происходит-раньше обращения к функции >std::future::get() или >std::shared_future::get(), которая извлекает сохраненное исключение.

D.4.5. Шаблон функции >std::async

Шаблон функции >std::async дает простой способ выполнить автономную асинхронную задачу с использованием доступного аппаратного параллелизма. Обращение к >std::async возвращает объект >std::future, который содержит результат задачи. В зависимости от политики запуска задача выполняется либо асинхронно в отдельном потоке, либо синхронно в том потоке, который вызвал функции-члены >wait() или >get() объекта >std::future.

Объявление

>enum class launch {

>async, deferred

>};


>template

>future::type>

>async(Callable&& func, Args&& ... args);


>template

>future::type>

>async(launch policy, Callable&& func, Args&& ... args);

Предусловия

Выражение >INVOKE(func, args) допустимо для переданных значений >func и >args. Тип >Callable и все члены >Args удовлетворяют требованиям концепции >MoveConstructible.

Результат

Конструирует копии >func и >args... во внутренней памяти (далее обозначаются >fff и >xyz... соответственно).

Если >policy равно >std::launch::async, то вызывает функцию >INVOKE(fff, xyz...) в отдельном потоке. Возвращенный объект >std::future становится готов, когда этот поток завершится, и будет содержать либо возвращенное функцией значение, либо возбужденное ей исключение. Деструктор последнего будущего объекта, ассоциированного с асинхронным состоянием возвращенного объекта >std::future, блокирует поток, пока будущий результат не будет готов.

Если >policy равно >std::launch::deferred, то >fff и >xyz... сохраняются в возвращенном объекте >std::future как отложенный вызов функции. При первом обращении к функции-члену >wait() или >get() будущего результата, который разделяет то же самое ассоциированное состояние, функция >INVOKE(fff, xyz...) синхронно вызывается в потоке, который обратился к >wait() или >get().

В ответ на вызов функции >get() этого объекта >std::future либо возвращается значение, полученное от >INVOKE(fff, xyz...), либо возбуждается исключение, которое имело место в этой функции.

Если >policy равно >std::launch::async | std::launch::deferred или аргумент >policy опущен, то поведение такое же, как если бы была задана политика >std::launch::async или >std::launch::deferred. Реализация сама выбирает нужное поведение при каждом вызове, чтобы в максимальной степени задействовать доступный аппаратный параллелизм, не вызывая при этом превышения лимита.

В любом случае функция >std::async возвращает управление немедленно.

Синхронизация

Завершение вызова функции происходит-раньше успешного возврата из функций >wait(), >get(), >wait_for() и >wait_until() любого экземпляра >std::future или >std::shared_future, который ссылается на то же ассоциированное состояние, что и объект >std::future, возвращенный функцией >std::async. Если >policy равно >std::launch::async, то завершение потока, в котором имел место вызов >std::async, также происходит-раньше успешного возврата из этих функций.

Исключения

>std::bad_alloc, если не удалось выделить внутреннюю память или >std::future_error, если не удалось добиться желаемого эффекта, или исключение, возбужденное в ходе конструирования >fff или >xyz....

D.5. Заголовок >

В заголовке > объявлены средства, обеспечивающие взаимное исключение: типы мьютексов и блокировок, различные функции и механизм, гарантирующий, что некая операция выполнена ровно один раз.

Содержимое заголовка

>namespace std {

>class mutex;

>class recursive_mutex;

>class timed_mutex;

>class recursive_timed_mutex;


>struct adopt_lock_t;

>struct defer_lock_t;

>struct try_to_lock_t;


>constexpr adopt_lock_t adopt_lock{};

>constexpr defer_lock_t defer_lock{};

>constexpr try_to_lock_t try_to_lock{};


>template

>class lock_guard;


>template

>class unique_lock;


>template

>void lock(LockableType1& m1, LockableType2& m2...);


>template

>int try_lock(LockableType1& m1, LockableType2& m2...);


>struct once_flag;


>template

>void call_once(once_flag& flag, Callable func, Args args...);

>}

D.5.1. Класс >std::mutex


Еще от автора Энтони Д Уильямс
Викиномика. Как массовое сотрудничество изменяет всё

Это знаменитый бестселлер, который научит вас использовать власть массового сотрудничества и покажет, как применять викиномику в вашем бизнесе. Переведенная более чем на двадцать языков и неоднократно номинированная на звание лучшей бизнес-книги, "Викиномика" стала обязательным чтением для деловых людей во всем мире. Она разъясняет, как массовое сотрудничество происходит не только на сайтах Wikipedia и YouTube, но и в традиционных компаниях, использующих технологии для того, чтобы вдохнуть новую жизнь в свои предприятия.Дон Тапскотт и Энтони Уильямс раскрывают принципы викиномики и рассказывают потрясающие истории о том, как массы людей (как за деньги, так и добровольно) создают новости, изучают геном человека, создают ремиксы любимой музыки, находят лекарства от болезней, редактируют школьные учебники, изобретают новую косметику, пишут программное обеспечение и даже строят мотоциклы.Знания, ресурсы и вычислительные способности миллиардов людей самоорганизуются и превращаются в новую значительную коллективную силу, действующую согласованно и управляемую с помощью блогов, вики, чатов, сетей равноправных партнеров и личные трансляции.


Рекомендуем почитать
Человеческий фактор в программировании

Хорошее программное обеспечение создается людьми. Так же как и плохое. Именно поэтому основная тема этой книги — не аппаратное и не программное обеспечение, а человеческий фактор в программировании (peopleware). Первое издание «Constantine on Peopleware» признано классическим трудом в области информационных технологий. Новая книга Ларри Константина включает все 52 легендарные статьи из предыдущей книги и 25 новых эссе.Peopleware охватывает все аспекты, связанные с ролью людей в разработке программного обеспечения.


QT 4: программирование GUI на С++

Единственное официальное руководстро по практическому программированию в среде Qt 4.1.Применяя средства разработки Qt компании «Trolltech», вы сможете создавать на С++ промышленные приложения, которые естественно работают в средах Windows, Linux/UNIX, Linux для встроенных систем без изменения программного кода и Mac Os X. Книга написана сотрудниками компании «Trolltech». Она представляет собой практическое руководство по успешному применению самой мощной из всех созданных до сих пор версий Qt — Qt 4.1.Из книги «Qt 4: программирование GUI на С++» вы узнаете о наиболее эффективных приемах и методах программирования с применением Qt 4 и овладеете ключевыми технологиями в самых различных областях — от архитектуры Qt модель/представление до мощного графического процессора 2D.


Энциклопедия разработчика модулей ядра Linux

Linux Kernel Module Programming Guide свободная книга; Вы можете воспроизводить и/или изменять ее в соответствии с версией 2 (или, в вашем случае, любой более поздней версией) GNU General Public License, опубликованной Free Software Foundation. Версия 2 поставляется с этим документом в Приложении E.Эта книга распространяется в надежде, что будет полезна, но без какой-либо гарантии; даже без подразумеваемой гарантии высокого спроса или пригодности какой-либо для специфической цели.Автор поощряет широкое распространение этой книги для персонального или коммерческого использования, если вышеупомянутое примечание относительно авторского права остается неповрежденным, и распространитель твердо придерживается условий GNU General Public License (см.


Применение Windows API

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Использование ListView в режиме виртуального списка

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.