Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Название:Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2012
- Город:Москва
- ISBN:978-5-94074-448-1
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ краткое содержание
Книга «Параллельное программирование на С++ в действии» не предполагает предварительных знаний в этой области. Вдумчиво читая ее, вы научитесь писать надежные и элегантные многопоточные программы на С++11. Вы узнаете о том, что такое потоковая модель памяти, и о том, какие средства поддержки многопоточности, в том числе запуска и синхронизации потоков, имеются в стандартной библиотеке. Попутно вы познакомитесь с различными нетривиальными проблемами программирования в условиях параллелизма.
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Возвращаемое значение
std::future_status::deferred, если асинхронный результат, ассоциированный с *this, содержит отложенную функцию, полученную обращением к std::async, и эта функция, еще не начала исполняться. std::future_status::ready, если асинхронный результат, ассоциированный с *this, готов, std::future_status::timeout, если Clock::now()вернула время, большее или равное a bsolute_time.
Примечание. Не дается никаких гарантий относительно того, сколько времени будет блокирован вызывающий поток. Гарантируется лишь, что если функция вернула std::future_status::timeout, то значение, возвращенное Clock::now(), больше или равно absolute_timeв точке, где поток разблокировался.
Исключения
Нет.
STD::SHARED_FUTURE::GET , ФУНКЦИЯ-ЧЛЕН
Если ассоциированное состояние содержит отложенную функцию, полученную в результате обращения к std::async, то вызывает эту функцию и возвращает результат. В противном случае ждет готовности асинхронного результата, ассоциированного с экземпляром std::shared_future, а затем либо возвращает сохраненное в нем значение, либо возбуждает сохраненное в нем исключение.
Объявление
void shared_future::get() const;
R& shared_future::get() const;
R const& shared_future::get() const;
Предусловия
this->valid()должно возвращать true.
Результат
Обращения из нескольких потоков к функциям get()и wait()экземпляров std::shared_future, разделяющих одно и то же ассоциированное состояние, сериализуются. Если ассоциированное состояние содержит отложенную функцию, то первое обращение к get()или wait()приводит к вызову этой функции и сохранению возвращенного ей значения или возбужденного ей исключения в асинхронном результате.
Блокирует поток, пока не будет готов асинхронный результат, ассоциированный с *this. Если в результате хранится исключение, возбуждает его, иначе возвращает хранящееся значение.
Возвращаемое значение
Если ResultType— void, то функция просто возвращает управление. Если ResultType — R&для некоторого типа R, то возвращает хранящуюся ссылку. Иначе возвращает константную ссылку на хранящееся значение.
Исключения
Хранящееся исключение, если таковое имеется.
D.4.3. Шаблон класса std::packaged_task
Шаблон класса std::packaged_taskупаковывает функцию или другой допускающий вызов объект, так что при вызове функции через экземпляр std::packaged_taskрезультат сохраняется в виде асинхронного результата, который может быть получен с помощью объекта std::future.
Экземпляры std::packaged_taskудовлетворяют требованиям концепций MoveConstructibleи MoveAssignable, но не CopyConstructibleи CopyAssignable.
Определение класса
template
class packaged_task; // не определен
template
class packaged_task {
public:
packaged_task() noexcept;
packaged_task(packaged_task&&) noexcept;
~packaged_task();
packaged_task& operator=(packaged_task&&) noexcept;
packaged_task(packaged_task const&) = delete;
packaged_task& operator=(packaged_task const&) = delete;
void swap(packaged_task&) noexcept;
template
explicit packaged_task(Callable&& func);
template
packaged_task(
std::allocator_arg_t, const Allocator&, Callable&&);
bool valid() const noexcept;
std::future get_future();
void operator()(ArgTypes...);
void make_ready_at_thread_exit(ArgTypes...); void reset();
};
STD::PACKAGED_TASK , КОНСТРУКТОР ПО УМОЛЧАНИЮ
Конструирует объект std::packaged_task.
Объявление
packaged_task() noexcept;
Результат
Конструирует экземпляр std::packaged_task, с которым не ассоциировала ни задача, ни асинхронный результат.
Исключения
Нет.
STD::PACKAGED_TASK , КОНСТРУИРОВАНИЕ ИЗ ДОПУСКАЮЩЕГО ВЫЗОВ ОБЪЕКТА
Конструирует экземпляр std::packaged_task, с которым ассоциированы задача и асинхронный результат.
Объявление
template
packaged_task(Callable&& func);
Предусловия
Должно быть допустимо выражение func(args...), где каждый элемент args- i в списке args...должен быть значением соответственного типа ArgTypes- i в списке ArgTypes.... Возвращаемое значение должно допускать преобразование в тип ResultType.
Результат
Конструирует экземпляр std::packaged_task, с которым ассоциированы еще не готовый асинхронный результат типа ResultTypeи задача типа Callable, полученная копированием func.
Исключения
Исключение типа std::bad_alloc, если конструктор не смог выделить память для асинхронного результата. Любое исключение, возбуждаемое копирующим или перемещающим конструктором Callable.
STD::PACKAGED_TASK , КОНСТРУИРОВАНИЕ ИЗ ДОПУСКАЮЩЕГО ВЫЗОВ ОБЪЕКТА С РАСПРЕДЕЛИТЕЛЕМ
Конструирует экземпляр std::packaged_task, с которым ассоциированы задача и асинхронный результат, применяя предоставленный распределитель для выделения памяти под асинхронный результат и задачу
Объявление
template
packaged_task(
std::allocator_arg_t, Allocator const& alloc, Callable&& func);
Предусловия
Должно быть допустимо выражение func(args...), где каждый элемент args- i в списке args...должен быть значением соответственного типа ArgTypes- i в списке ArgTypes.... Возвращаемое значение должно допускать преобразование в тип ResultType.
Результат
Конструирует экземпляр std::packaged_task, с которым ассоциированы еще не готовый асинхронный результат типа ResultTypeи задача типа Callable, полученная копированием func. Память под асинхронный результат и задачу выделяется с помощью распределителя allocили его копии.
Исключения
Любое исключение, возбуждаемое распределителем в случае неудачной попытки выделить память под асинхронный результат или задачу. Любое исключение, возбуждаемое копирующим или перемещающим конструктором Callable.
STD::PACKAGED_TASK , ПЕРЕМЕЩАЮЩИЙ КОНСТРУКТОР
Конструирует один объект std::packaged_taskиз другого, передавая владение асинхронным результатом и задачей, ассоциированными с объектом other, вновь сконструированному.
Объявление
packaged_task(packaged_task&& other) noexcept;
Результат
Конструирует новый экземпляр std::packaged_task.
Постусловия
Асинхронный результат и задача, которые были ассоциированы с объектом otherдо вызова конструктора, ассоциируются со вновь сконструированным объектом std::packaged_task. С объектом otherбольше не связан никакой асинхронный результат.
Исключения
Нет.
STD::PACKAGED_TASK , ПЕРЕМЕЩАЮЩИЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Интервал:
Закладка: