Параллелизм в С++ на примере библиотеки Pthread | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 11 мая, печатный экземпляр отправим 15 мая.

Опубликовать статью в журнале

Авторы: ,

Рубрика: Информационные технологии

Опубликовано в Молодой учёный №19 (414) май 2022 г.

Дата публикации: 11.05.2022

Статья просмотрена: 88 раз

Библиографическое описание:

Морозова, В. И. Параллелизм в С++ на примере библиотеки Pthread / В. И. Морозова, Д. И. Логунова. — Текст : непосредственный // Молодой ученый. — 2022. — № 19 (414). — С. 24-26. — URL: https://moluch.ru/archive/414/91372/ (дата обращения: 28.04.2024).



В статье авторы рассматривают многопоточное программирование.

Ключевые слова: поток, параллельное программирование, модель памяти, приложение.

В своё время параллельное программирование было интересно только для тех людей, которых привлекали сложные задачи для больших суперкомпьютеров. В настоящее время, когда на многоядерных процессорах начали работать обычные приложения, параллельное программирование быстро стало технологией, которая заинтересовала основную массу программистов, а также параллелизм в целом и многопоточное программирование, которое должен освоить и уметь применять любой конкурентоспособный профессиональный разработчик программного обеспечения.

Таким образом, можно выделить всего лишь две ключевые причины употребления параллелизма в приложениях: повышение производительности и разделение обязанностей. Поэтому если объединить взаимосвязанные части кода, а другие разъединить, то программа станет понятнее, будет проще тестироваться, а также уменьшится количество ошибок. Вычислительная мощь увеличивается, когда задачи выполняются параллельно.

Определим основные понятия. Параллелизм — это выполнение системой некоторых действий в одно время. Поток — это часть процесса, которая выполняет определенные задачи. Многопоточность — это свойство приложения, которое состоит в том, что процесс состоит из нескольких параллельно выполняющихся потоков.

Рассмотрим параллелизм на примере компилируемого языка программирования С++. Данный язык является популярным и широко используемым при создании серверов, драйверов устройств, операционных систем, различных прикладных программ, игр и приложений.

Расширения стандарта С++ 1998 не поддерживали корректную работу потоков, поэтому писать многопоточные приложения не получалось. Тогда был запущен стандарт C++11. Помимо того, что в нем определена абсолютно новая модель памяти с поддержкой многопоточности, так еще и в стандартную библиотеку C++ интегрированы классы для защиты разделяемых данных, управления потоками, синхронизации операций между потоками и низкоуровневых атомарных операций [1].

Эффективность — одна из проблем, с которой могли столкнуться разработчики приложений на С++. Приходится «платить за абстрагирование» при использовании каких-либо высокоуровневых механизмов, а не низкоуровневых средств, обертываемых ими. Тогда для того чтобы код стал более удобным для сопровождения помимо новой модели памяти была включена полная библиотека атомарных операций для прямого управления на уровне битов и байтов, а также средства межпоточной синхронизации и обеспечения видимости любых изменений [1].

Существуют различные библиотеки шаблонов, с помощью которых можно упростить реализацию многопоточности. Например, Intel Threading Building Blocks, Threads, OpenMP, Boost, а также Pthread.

Рассмотрим первую из них — Intel Treading Building Blocks. Она может работать с потоками, определяя их оптимальное количество, которое равняется количеству ядер процессора. Такая библиотека является достаточно функциональной, поскольку содержит в себе кроме функций для распараллеливания цикла ещё и сортировку (parallel_sort), объекты синхронизации, контейнеры, планировщика задач, аллокаторы.

Вторая — Threads. Эта библиотека появилась в стандарте языка в 2011 году. В ней представлено множество инструментов для работы с потоками, такие как условные переменные, мьютексы и т. д.

Третья — OpenMP. Основной упор в OpenMP делается на распараллеливание циклов.

Библиотека Boost — это набор частично компилируемых исходных кодов.

Pthreads включает в себя все, что нужно для создания многопоточных приложений. Сначала нужно создать идентификатор потока — его “имя”: pthread_t имя_потока. Функция pthread_create() позволяет добавить новый поток к текущему процессу, то есть создать его.

Продемонстрируем функцию в упрощенном виде на рис. 1:

Создание потока

Рис. 1. Создание потока

В случае успеха функция возвращает 0, в противном случае — ненулевое значение.

thread — это идентификатор созданного потока (указатель на область памяти, в которой в случае успешного создания потока размещается объект типа pthread_t, идентифицирующий поток), attr — атрибуты (указатель напеременную типа pthread_attr_t), которые получит поток; если указано NULL, то поток получит атрибуты по умолчанию: неограниченный, присоединяемый, имеющий приоритет родителя и размер стека по умолчанию. start_routine — функция, которую будет исполнять создаваемый поток; arg — единственный аргумент, который будет передан в функцию start_routine. Если в аргументе нет необходимости, необходимо указывать NULL.

Когда потоки принадлежат единственному процессу, они имеют общее адресное пространство. То есть, если для процесса определены глобальные переменные, то всякий поток может изменить их, а также иметь к ним доступ. Бывает так, что один поток читает данные в то время, когда другой поток их записывает. С помощью синхронизации можно исключить такие случаи. Кроме того, синхронизация позволяет управлять порядком исполнения потоков, что может быть полезным, например, если одному потоку для продолжения работы необходимы данные от другого потока. В Pthreads есть несколько способов синхронизации потоков. К наиболее часто используемым относятся мьютексы, барьеры, спинлоки и условные переменные.

Когда программируется приложение с несколькими потоками, обеспечивается thread safety потоковая безопасность для функций . Приложениям, выполняющимся через множество процессов, не доступны такие требования.

Таким образом, применение Pthreads не гарантирует лучшую производительность, но с использованием примитивов синхронизации можно добиться наилучшего результата при параллельном программировании.

Литература:

1. Уильямс Э. Параллельное программирование на С++ в действии. Практика разработки многопоточных программ. — Москва: ДМК Пресс, 2012.

2. C++, [Электронный ресурс],  Режим доступа: https://ru.wikipedia.org/wiki/C %2B %2B/, дата обращения: 09.05.2022

3. Pthreads: Потоки в русле POSIX++, [Электронный ресурс],  Режим доступа: https://habr.com/ru/post/326138/, дата обращения: 09.05.2022

Основные термины (генерируются автоматически): поток, NULL, параллельное программирование, модель памяти, приложение, многопоточное программирование, функция.


Ключевые слова

параллельное программирование, поток, приложение, модель памяти

Похожие статьи

Параллельное программирование | Статья в сборнике...

Параллельное программирование по праву считается наиболее перспективным и востребованным направлением в области разработки программного обеспечения. Это связано с известным противоречием: возрастающая сложность промышленных...

Параллельное программирование в Java | Статья в журнале...

Что такое параллельное программирование? В отличие от многопоточности, где каждая задача является дискретной логической единицей более крупной задачи

Одна из трудностей при реализации параллелизма в приложениях заключается в том, что коллекции не являются...

Разработка архитектуры построения многопоточного...

Разработка архитектуры построения многопоточного программного обеспечения на основе модели нейронной сети.

 Многопоточное программное обеспечение на сегодняшний день очень развито и

2 Денискин А. В. «Многопоточность в языке программирования C#».

Основы параллельной работы программ | Статья в журнале...

Ключевые слова: параллельная работа программ, параллелизм, вычислительная система, процесс, поток, ресурс, процессор. Любая вычислительная система, насколько бы мощной она ни была, обладает ограниченными ресурсами. Оперативная память, устройство чтения и...

Современные подходы к разработке мобильных приложений для...

Библиографическое описание: Сорока, В. Г. Современные подходы к разработке мобильных приложений для платформы Android / В. Г

 Создание приложения, использующего REST API в наше время стало обыденностью. Однако библиотеки Android не могут похвастаться...

Асинхронное выполнение SQL-запросов на языке...

Все современные приложения, написанные на разных языках программирования, так или иначе используют потоки.

Существует несколько технологий создания веб-страниц: с помощью серверного языка программирования (PHP, Ruby, Python и т. д.), с помощью языка.

Программирование синусоидального и пилообразного сигналов...

Программирование синусоидального и пилообразного сигналов с помощью цифро-аналогового преобразователя на микроконтроллере STM32 / А. А. Емельянов, В. В. Бесклеткин, А. Ю. Иванин [и др.].

Современные технологии управления фоновыми потоками...

 При запуске приложения ОС Android создает отдельный процесс для него, выделяя необходимое количество памяти. В пределах процесса приложение самостоятельно управляет потоками, разделяющими общее пространство памяти процесса.

Автоматизация поиска оптимальных параметров сетевого...

Ключевые слова: многопоточное программирование, Java, UDP, сетевое программирование, автоматизация.

С помощью разработанного автором приложения, можно найти оптимальные параметры при создании многопоточных сетевых приложений.

Похожие статьи

Параллельное программирование | Статья в сборнике...

Параллельное программирование по праву считается наиболее перспективным и востребованным направлением в области разработки программного обеспечения. Это связано с известным противоречием: возрастающая сложность промышленных...

Параллельное программирование в Java | Статья в журнале...

Что такое параллельное программирование? В отличие от многопоточности, где каждая задача является дискретной логической единицей более крупной задачи

Одна из трудностей при реализации параллелизма в приложениях заключается в том, что коллекции не являются...

Разработка архитектуры построения многопоточного...

Разработка архитектуры построения многопоточного программного обеспечения на основе модели нейронной сети.

 Многопоточное программное обеспечение на сегодняшний день очень развито и

2 Денискин А. В. «Многопоточность в языке программирования C#».

Основы параллельной работы программ | Статья в журнале...

Ключевые слова: параллельная работа программ, параллелизм, вычислительная система, процесс, поток, ресурс, процессор. Любая вычислительная система, насколько бы мощной она ни была, обладает ограниченными ресурсами. Оперативная память, устройство чтения и...

Современные подходы к разработке мобильных приложений для...

Библиографическое описание: Сорока, В. Г. Современные подходы к разработке мобильных приложений для платформы Android / В. Г

 Создание приложения, использующего REST API в наше время стало обыденностью. Однако библиотеки Android не могут похвастаться...

Асинхронное выполнение SQL-запросов на языке...

Все современные приложения, написанные на разных языках программирования, так или иначе используют потоки.

Существует несколько технологий создания веб-страниц: с помощью серверного языка программирования (PHP, Ruby, Python и т. д.), с помощью языка.

Программирование синусоидального и пилообразного сигналов...

Программирование синусоидального и пилообразного сигналов с помощью цифро-аналогового преобразователя на микроконтроллере STM32 / А. А. Емельянов, В. В. Бесклеткин, А. Ю. Иванин [и др.].

Современные технологии управления фоновыми потоками...

 При запуске приложения ОС Android создает отдельный процесс для него, выделяя необходимое количество памяти. В пределах процесса приложение самостоятельно управляет потоками, разделяющими общее пространство памяти процесса.

Автоматизация поиска оптимальных параметров сетевого...

Ключевые слова: многопоточное программирование, Java, UDP, сетевое программирование, автоматизация.

С помощью разработанного автором приложения, можно найти оптимальные параметры при создании многопоточных сетевых приложений.

Задать вопрос