Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Название:Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2012
- Город:Москва
- ISBN:978-5-94074-448-1
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ краткое содержание
Книга «Параллельное программирование на С++ в действии» не предполагает предварительных знаний в этой области. Вдумчиво читая ее, вы научитесь писать надежные и элегантные многопоточные программы на С++11. Вы узнаете о том, что такое потоковая модель памяти, и о том, какие средства поддержки многопоточности, в том числе запуска и синхронизации потоков, имеются в стандартной библиотеке. Попутно вы познакомитесь с различными нетривиальными проблемами программирования в условиях параллелизма.
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
typedef см. описание atomic_ssize_t;
typedef см. описание atomic_ptrdiff_t;
typedef см. описание atomic_intmax_t;
typedef см. описание atomic_uintmax_t;
template
struct atomic;
extern "C" void atomic_thread_fence(memory_order order);
extern "C" void atomic_signal_fence(memory_order order);
template
T kill_dependency(T);
}
D.3.1. std::atomic_xxx
, псевдонимы типов
Для совместимости с ожидаемым стандартом С предоставляются псевдонимы typedef
для атомарных целочисленных типов. Это псевдонимы либо соответствующей специализации std::atomic
, либо базового класса этой специализации с таким же интерфейсом.
Таблица D.1.Псевдонимы атомарных типов и соответствующие им специализации std::atomic<>
std::atomic_ itype |
Специализация std::atomic<> |
---|---|
std::atomic_char |
std::atomic |
std::atomic_schar |
std::atomic |
std::atomic_uchar |
std::atomic |
std::atomic_short |
std::atomic |
std::atomic_ushort |
std::atomic |
std::atomic_int |
std::atomic |
std::atomic_uint |
std::atomic |
std::atomic_long |
std::atomic |
std::atomic_ulong |
std::atomic |
std::atomic_llong |
std::atomic |
std::atomic_ullong |
std::atomic |
std::atomic_wchar_t |
std::atomic |
std::atomic_char16_t |
std::atomic |
std::atomic_char32_t |
std::atomic |
D.3.2. ATOMIC_ xxx _LOCK_FREE
, макросы
Эти макросы определяют, являются ли атомарные типы, соответствующие различным встроенным типам, свободными от блокировок.
Объявления макросов
#define ATOMIC_BOOL_LOCK_FREE см. описание
#define ATOMIC_CHAR_LOCK_FREE см. описание
#define ATOMIC_SHORT_LOCK_FREE см. описание
#define ATOMIC_INT_LOCK_FREE см. описание
#define ATOMIC_LONG_LOCK_FREE см. описание
#define ATOMIC_LLONG_LOCK_FREE см. описание
#define ATOMIC_CHAR16_T_LOCK_FREE см. описание
#define ATOMIC_CHAR32_T_LOCK_FREE см. описание
#define ATOMIC_WCHAR_T_LOCK_FREE см. описание
#define ATOMIC_POINTER_LOCK_FREE см. описание
Значением ATOMIC_ xxx _LOCK_FREE
может быть 0, 1 или 2. Значение 0 означает, что операции над знаковыми и беззнаковыми атомарными типами, соответствующими типу xxx
, никогда не свободны от блокировок; 1 — что операции могут быть свободны от блокировок для одних экземпляров этих типов и не свободны для других; 2 — что операции всегда свободны от блокировок. Например, если ATOMIC _INT_LOCK_FREE
равно 2, то операции над любыми экземплярами std::atomic
и std::atomic
свободны от блокировок.
Макрос ATOMIC_POINTER_LOCK_FREE
позволяет узнать, свободны ли от блокировок операции над атомарными специализациями указателя std::atomic
.
D.3.3. ATOMIC_VAR_INIT
, макрос
Макрос ATOMIC_VAR_INIT
позволяет инициализировать атомарную переменную конкретным значением.
Объявление
#define ATOMIC_VAR_INIT(value) см. описание
Макрос расширяется в последовательность лексем, которую можно использовать в выражении следующего вида для инициализации одного из стандартных атомарных типов указанным значением:
std::atomic x = ATOMIC_VAR_INIT(val);
Указанное значение должно быть совместимо с неатомарным типом, соответствующим данной атомарной переменной, например:
std::atomic i = ATOMIC_VAR_INIT(42);
std::string s;
std::atomic p = ATOMIC_VAR_INIT(&s);
Такая инициализация не атомарна, то есть любой доступ из другого потока к инициализируемой переменной в случае, когда инициализация не происходит-раньше этого доступа, приводит к гонке за данными и, следовательно, к неопределённому поведению.
D.3.4. std::memory_order
, перечисление
Перечисление std::memory_order
применяется для задания упорядочения доступа к памяти при выполнении атомарных операций.
Объявление
typedef enum memory_order {
memory_order_relaxed, memory_order_consume,
memory_order_acquire, memory_order_release,
memory_order_acq_rel, memory_order_seq_cst
} memory_order;
Операции, помеченные элементами этого перечисления, ведут себя, как описано ниже (подробное описание упорядочения доступа к памяти см. в главе 5).
STD::MEMORY_ORDER_RELAXED
Операция не обеспечивает никаких дополнительных ограничений на упорядочение.
STD::MEMORY_ORDER_RELEASE
Операция освобождения указанной ячейки памяти. Следовательно, она синхронизируется-с операцией захвата той же ячейки памяти, которая читает сохраненное значение.
STD::MEMORY_ORDER_ACQUIRE
Операция захвата указанной ячейки памяти. Если сохраненное значение было записано операцией освобождения, то сохранение синхронизируется-с этой операцией.
STD::MEMORY_ORDER_ACQ_REL
Операция чтения-модификации-записи. Ведет себя так, как будто одновременно заданы ограничения std::memory_order_acquire
и std::memory_order_release
для доступа к указанной ячейке памяти.
STD::MEMORY_ORDER_SEQ_CST
Операция является частью цепочки последовательно согласованных операций, на которой определено полное упорядочение. Кроме того, если это сохранение, то оно ведет себя как операция с ограничением std::memory_order_release
, если загрузка — то как операция с ограничением std::memory_order_acquire
, а если это операция чтения-модификации-записи, то она ведет себя как операция с обоими ограничениями std::memory_order_acquire
и std::memory_order_release
. Эта семантика по умолчанию подразумевается для всех операций .
STD::MEMORY_ORDER_CONSUME
Операция потребления указанной ячейки памяти.
D.3.5. std::atomic_thread_fence
, функция
Функция std::atomic_thread_fence()
вставляет в программу «барьер», чтобы принудительно обеспечить упорядочение доступа к памяти со стороны нескольких операций.
Объявление
extern "С" void atomic_thread_fence(std::memory_order order);
Результат
Вставляет барьер с требуемыми ограничениями на упорядочение доступа к памяти.
Барьер, для которого параметр order
равен std::memory_order_release
, std::memory_order_acq_rel
или std::memory_order_seq_cst
синхронизируется-с операцией захвата некоторой ячейки памяти, если эта операция читает значение, сохраненное атомарной операцией, следующей за барьером в том же потоке, где поставлен барьер.
Операция освобождения синхронизируется-с барьером, для которого параметр order
равен std::memory_order_acquire
, std::memory_order_acq_rel
или std::memory_order_seq_cst
, если эта операция освобождения сохраняет значение, которое читается атомарной операцией, предшествующей барьеру, в том же потоке, где поставлен барьер.
Исключения
Нет.
D.3.6. std::atomic_signal_fence
, функция
Функция std::atomic_signal_fence()
вставляет в программу «барьер», чтобы принудительно обеспечить упорядочение доступа к памяти со стороны операций в некотором потоке и операций в обработчике сигнала, находящемся в том же потоке.
Интервал:
Закладка: