Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Название:Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2012
- Город:Москва
- ISBN:978-5-94074-448-1
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ краткое содержание
Книга «Параллельное программирование на С++ в действии» не предполагает предварительных знаний в этой области. Вдумчиво читая ее, вы научитесь писать надежные и элегантные многопоточные программы на С++11. Вы узнаете о том, что такое потоковая модель памяти, и о том, какие средства поддержки многопоточности, в том числе запуска и синхронизации потоков, имеются в стандартной библиотеке. Попутно вы познакомитесь с различными нетривиальными проблемами программирования в условиях параллелизма.
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Результат
Захватывает все объекты m1, m2, … допускающих блокировку типов, обращаясь к функциям-членам lock(), try_lock()и unlock()этих типов в порядке, который гарантированно не приводит к взаимоблокировкам, но в остальном не специфицирован.
Постусловия
Текущий поток захватывает все переданные в аргументах объекты.
Исключения
Любое исключение, возбуждаемое обращениями к функциям lock(), try_lock()и unlock().
Примечание. Если исключение распространяется за пределы std::lock, то для любого объекта m1, m2, …, для которого в результате обращения к lock()или try_lock()была успешно получена блокировка, гарантированно будет вызвана функция unlock().
D.5.8. Шаблон функции std::try_lock
Шаблон функции std::try_lockпредоставляет возможность захватить сразу несколько допускающих блокировку объектов, так что либо захвачены все, либо ни один.
Объявление
template
int try_lock(LockableType1& m1, LockableType2& m2...);
Предусловия
Типы параметров LockableType1, LockableType2, … должны удовлетворять требованиям концепции Lockable.
Результат
Пытается захватить все объекты m1, m2, … допускающих блокировку типов, обращаясь по очереди к функции try_lock()каждого из них. Если try_lock()вернёт falseили возбудит исключение, то уже захваченные блокировки освобождаются путем вызова функции unlock()соответствующего объекта.
Возвращаемое значение
-1, если были захвачены все блокировки (то есть все вызовы try_lock()вернули true), в противном случае начинающийся с нуля индекс объекта, для которого вызов try_lock()вернул false.
Постусловия
Если функция вернула -1, то текущий поток захватил все переданные в аргументах объекты. В противном случае все объекты, которая функция успела захватить, освобождены.
Исключения
Любое исключение, возбуждаемое обращениями к функции try_lock.
Примечание. Если исключение распространяется за пределы std::try_lock, то для любого объекта m1, m2, …, для которого в результате обращения к try_lock()была успешно получена блокировка, гарантированно будет вызвана функция unlock().
D.5.9. Класс std::once_flag
Экземпляры класса std::once_flagиспользуются совместно с шаблоном функции std::call_onceдля гарантии того, что некая функция будет вызвала ровно один раз, даже если ее могут вызывать одновременно несколько потоков.
Экземпляры std::once_flagне удовлетворяют требованиям концепций CopyConstructible, CopyAssignable, MoveConstructibleи MoveAssignable.
Определение класса
struct once_flag {
constexpr once_flag() noexcept;
once_flag(once_flag const&) = delete;
once_flag& operator=(once_flag const&) = delete;
};
STD::ONCE_FLAG , КОНСТРУКТОР ПО УМОЛЧАНИЮ
Создает объект std::once_flagв состоянии, обозначающем, что ассоциированная функция еще не вызывалась.
Объявление
constexpr once_flag() noexcept;
Результат
Конструирует новый экземпляр std::once_flag, оставляя его в состоянии, означающем, что ассоциированная функция еще не вызывалась. Поскольку в конструкторе присутствует квалификатор constexpr, то экземпляр со статическим временем жизни конструируется на этапе статической инициализации, что предотвращает состояние гонки и зависимость от порядка инициализации.
D.5.10. Шаблон функции std::call_once
Шаблон функции std::call_onceиспользуется совместно с объектом std::once_flagдля гарантии того, что некая функция будет вызвала ровно один раз, даже если ее могут вызывать одновременно несколько потоков.
Объявление
template
void call_once(
std::once_flag& flag, Callable func, Args args...);
Предусловия
Выражение INVOKE(func, args)допустимо для переданных значений funcи args. Тип Callableи все члены Argsудовлетворяют требованиям концепции MoveConstructible.
Результат
Обращения к std::call_onceс одним и тем же объектом std::once_flagсериализуются. Если раньше не было результативного обращения к std::call_onceс данным объектом std::once_flag, то аргумент func(или его копия) вызывается так, будто имело место обращение к INVOKE(func, args), причем вызов std::call_onceсчитается результативным тогда и только тогда, когда вызов funcзавершился без возбуждения исключения. Если имело место исключение, то оно передается вызывающей программе. Если ранее уже было результативное обращение к std::call_onceс данным объектом std::once_flag, то новый вызов std::call_onceвозвращает управление, не вызывая func.
Синхронизация
Возврат из результативного вызова std::call_onceс объектом std::once_flagпроисходит-раньше всех последующих вызовов std::call_onceс тем же объектом std::once_flag.
Исключения
Исключение типа std::system_error, если желаемого эффекта добиться не удалось, или любое исключение, возбужденное при обращении к func.
D.6. Заголовок
В заголовке объявлены средства для поддержки арифметических операций с рациональными числами на этапе компиляции.
Содержимое заголовка
namespace std {
template
class ratio;
// арифметические операции с рациональными числами
template
using ratio_add = см. описание ;
template
using ratio_subtract = см. описани е;
template
using ratio_multiply = см. описание ;
template
using ratio_divide = см. описание ;
// сравнение рациональных чисел
template
struct ratio_equal;
template
struct ratio_not_equal;
template
struct ratio_less;
template
struct ratio_less_equal;
template
struct ratio_greater;
template
struct ratio_greater_equal;
typedef ratio<1, 1000000000000000000> atto;
typedef ratio<1, 1000000000000000> femto;
typedef ratio<1, 1000000000000> pico;
typedef ratio<1, 1000000000> nano;
typedef ratio<1, 1000000> micro;
typedef ratio<1, 1000> milli;
typedef ratio<1, 100> centi;
typedef ratio<1, 10> deci;
typedef ratio<10, 1> deca;
typedef ratio<100, 1> hecto;
typedef ratio<1000, 1> kilo;
typedef ratio<1000000, 1> mega;
typedef ratio<1000000000, 1> giga;
typedef ratio<1000000000000, 1> tera;
typedef ratio<1000000000000000, 1> peta;
typedef ratio<1000000000000000000, 1> exa;
D.6.1. Шаблон класса std::ratio
Шаблон класса предоставляет механизм для выполнения на этапе компиляции арифметических операций с рациональными числами, например: деления пополам ( std::ratio<1, 2>), нахождения двух третей ( std::ratio<2, 3>) пятнадцати сорок третьих ( std::ratio<15, 43>). В стандартной библиотеке С++ этот шаблон используется для задания периода при конкретизации шаблона класса std::chrono::duration.
Интервал:
Закладка: