Меню
Главная
Случайная статья
Настройки
|
Стандартная библиотека языка C++ предоставляет разработчикам поддержку при написании многопоточных программ.
Поддержка параллелизма включает в себя:
- Модель памяти (Memory model) — набор правил, касающихся параллельного доступа к памяти. Эта модель создана для гарантии того, что простой и привычный доступ параллельный задач к памяти будет вести себя привычным для разработчика образом.
- Поддержка программирования без блокировок — низкоуровневый механизм предотвращения состояния гонки.
- Библиотека Thread — набор компонент в помощь традиционному стилю разработки многопоточных программ с использованием нитей (threads) и блокировок (locks). Включает в себя такие составляющие, как thread, conditional variable, mutext.
- Поддержка многозадачного программирования (Task support library) — future, async, promise, package task.
Содержание
История
В стандарте появилась начиная с C++11.
Основные понятия
Развитие многоядерных процессоров привело к широкой поддержке параллелизма в программировании — одновременного исполнения нескольких вычислений. Некоторые действия или вычисления, которые потенциально могут исполняться параллельно, называются задачами. Традиционным представлением понятия задачи на уровне операционной системы в рамках одного процесса является поток выполнения (thread). В терминах стандарта языка С++ — это одинарный поток управления в программе, который включает в себя первоначальный вызов специальной функции верхнего уровня, а далее, рекурсивно, каждый вызов функции, последовательно выполненной в этом потоке. Каждый поток выполнения потенциально имеет доступ к каждой функции или объекту программы. Блокировкой в контексте стандартной библиотеки является мьютекс, а также любая абстракция, построенная поверх мьютекса для предоставления взаимоисключающего доступа к ресурсам или для синхронизации работы нескольких параллельных задач[1].
Модель памяти
Набор правил и гарантий ядра языка, касающихся параллельного использования памяти определены в стандарте как модель памяти. Модель памяти являет собой результат обсуждений разработчиков компиляторов и проектировщиков компьютерной архитектуры. Это своего рода соглашение между разработчиками компиляторов и программистами о гарантии того, что большинству программистов не придётся задумываться о низкоуровневых деталях при разработке. Ключевым понятием в этой модели является ячейка памяти (memory location). Это либо объект целочисленного типа, либо максимальная последовательность выровненных битовых полей ненулевой длинны.
Основным требованием стандарта является то, что два или более потока исполнения могут получать доступ и изменять различные ячейки памяти независимо, не мешая друг другу.
Пример ячеек памяти.
struct {
char a;
int b:5,
c:11,
:0,
d:8;
struct {int ee:8;} e;
};
Здесь переменные a и e являются отдельными ячейками памяти. Битовое поле d также является отдельной ячейкой поскольку оно отделено от предыдущих полей битовым полем нулевой длинны — особой парой символов специального назначения. Битовые же поля b и c рассматриваются компилятором как одна ячейка памяти, и одновременное изменения этих полей в разных потоках может потенциально повредить данные.
Атомарные операции
Примитивные операции, которые выполняются как единое целое и которые не могут потенциально ввести программу в состояние гонки при изменении одних и тех же ячеек памяти из разных потоков, называются атомарными операциями.
Синхронизация и порядок памяти
Операция синхронизации — это процесс приведения работы потоков к такому состоянию, что на определённых этапах работы один поток «видит» результат работы другого потока. Таки операции важны, поскольку между операциями синхронизации компилятор и процессор могут изменять порядок исполняемых инструкции в целях производительности. Стандарт определяет три типа операций синхронизации над ячейками памяти:
- Операция заполучения (acquire operation) — остальные потоки увидят эффект этой операции перед каким-либо эффектом последующей операции.
- Операция освобождения (release operation) — остальные потоки увидят эффект этой операции после всех предшествующих эффектов.
- Операция — (consume operation) — более слабая форма операции заполучения. Остальные потоки увидят эффект этой операции перед каким-либо эффектом за исключением эффектов от операций, не связанных со значением, над которым эта операция проводится.
Потоки
Блокировки
Примечания
-
Stroustrup, Bjarne. The C++ Programming Language: Fourth Edition. — Addison-Wesley, 2013. — ISBN 978-0-321-56384-2.
Ссылки
|
|