Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Название:Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2012
- Город:Москва
- ISBN:978-5-94074-448-1
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ краткое содержание
Книга «Параллельное программирование на С++ в действии» не предполагает предварительных знаний в этой области. Вдумчиво читая ее, вы научитесь писать надежные и элегантные многопоточные программы на С++11. Вы узнаете о том, что такое потоковая модель памяти, и о том, какие средства поддержки многопоточности, в том числе запуска и синхронизации потоков, имеются в стандартной библиотеке. Попутно вы познакомитесь с различными нетривиальными проблемами программирования в условиях параллелизма.
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
void promise::set_value_at_thread_exit(R& r);
void promise::set_value_at_thread_exit(R const& r);
void promise::set_value_at_thread_exit(R&& r);
Предусловия
С *this
ассоциирован асинхронный результат.
Результат
Сохраняет r
в асинхронном результате, ассоциированном с *this
, если ResultType
— не void
. Помечает, что в асинхронном результате хранится значение. Планирует перевод ассоциированного асинхронного результата в состояние готовности в момент завершения потока.
Постусловия
Асинхронный результат, ассоциированный с *this
, содержит значение, но не является готовым до завершения текущего потока. Все потоки, ожидающие асинхронного результата, будут разблокированы, когда текущий поток завершится.
Исключения
Исключение типа std::future_error
с кодом ошибки std::future_errc::promise_already_satisfied
, если в асинхронном результате уже находится значение или исключение. Любое исключение, возбужденное копирующим или перемещающим конструктором r
.
Синхронизация
Обращения к set_value()
, set_value_at_thread_exit()
, set_exception()
и set_exception_at_thread_exit()
сериализуются. Успешное обращение к set_value()
происходит-раньше обращения к функции std::future::get()
или std::shared_future::get()
, которая извлекает сохраненное значение.
STD::PROMISE::SET_EXCEPTION
, ФУНКЦИЯ-ЧЛЕН КЛАССА
Сохраняет исключение в асинхронном результате, ассоциированном с *this
.
Объявление
void set_exception(std::exception_ptr e);
Предусловия
С *this
ассоциирован асинхронный результат. (bool)e
равно 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()
, которая извлекает сохраненное исключение.
STD::PROMISE::SET_EXCEPTION_AT_THREAD_EXIT,
ФУНКЦИЯ-ЧЛЕН
Сохраняет исключение в асинхронном результате, ассоциированном с *this
, но не делает этот результат готовым раньше момента завершения потока.
Объявление
void set_exception_at_thread_exit(std::exception_ptr e);
Предусловия
С *this
ассоциирован асинхронный результат, (bool)e
равно 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
, также происходит-раньше успешного возврата из этих функций.
Интервал:
Закладка: