Параллельное программирование C++?

Я все время слышу о параллельном программировании. Не могли бы вы пролить свет на то, что это такое и как новые стандарты С ++ помогают делать то же самое?

Если параллельные вычисления для вас новичок, обязательно ознакомьтесь с некоторыми базовыми статьями, такими как en.wikipedia.org/wiki/Concurrent_programming.

lothar 13.04.2009 05:22

Статьи: проверьте эти статьи, чтобы узнать о параллелизме 1. Бесплатный обед закончился 2. Избранные статьи от grassutter 3. Ссылка на pdf

yesraaj 06.11.2008 09:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
47
2
42 555
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Возможно, это видео поможет пролить свет на вас :-)
http://channel9.msdn.com/posts/Charles/The-Concurrency-Runtime-Fine-Grained-Parallelism-for-C/

Параллелизм - это наличие нескольких потоков выполнения для данного процесса. На сегодняшний день C++ не поддерживает это напрямую. Однако существует несколько библиотек, которые связывают данную функцию с новым потоком выполнения. Стандарт Unix - это библиотека pthreads.

Стандарт Posix (не Unix)

Martin York 20.10.2008 19:56

Может ли кто-нибудь объяснить мне, как могут быть 2 спорных ответа: да, C++ - это параллельный язык (см. Выше), и нет, параллелизм - это другое (это)? Кто не прав?

Martian 26.05.2020 13:30
Ответ принят как подходящий

Параллелизм - это когда ваш код выполняет несколько задач одновременно. Обычно это делается с помощью явных «потоков», но есть и другие возможности. Например, если вы используете в своем коде директивы OpenMP, то компилятор, поддерживающий OpenMP, автоматически сгенерирует для вас потоки.

Поток - это сокращение от «поток выполнения». В однопоточной программе C++ выполнение начинается с main (), а затем продолжается последовательно. В многопоточной программе первый поток начинается с основного, но приложение может запускать дополнительные потоки, которые запускаются с указанной пользователем функции. Затем они выполняются одновременно или параллельно с исходным потоком.

В C++ потоки 0x запускаются с использованием класса std::thread:

void my_function()
{
    // do stuff
}
std::thread my_thread(my_function); // run my_function in its own thread

Новый стандарт C++ 0x также поддерживает:

  • атомарные значения и операции с шаблоном класса std::atomic<>,
  • мьютексы для защиты данных (std::mutex, std::recursive_mutex и др.)
  • классы блокировки для простоты управления сроком службы блокировки (std::lock_guard<>, std::unique_lock<>)
  • Функции std::lock и std::try_lock позволяют управлять получением нескольких блокировок одновременно без риска возникновения взаимоблокировки.
  • переменные состояния для облегчения ожидания события (std::condition_variable, std::condition_variable_any)
  • Futures, Promises и упакованные задачи для упрощения передачи данных между потоками и ожидания готовности значения. Это решает классический вопрос «как мне вернуть значение из потока».
  • поточно-ориентированная инициализация локальных статических объектов
  • ключевое слово thread_local для объявления локальных данных потока

Более подробный обзор новой библиотеки потоков C++ 0x я дал в своей статье на devx.com: Упрощенная многопоточность в C++ 0x

Я пишу о многопоточности и параллелизме в C++ на мой блог. Еще пишу книгу по теме: Параллелизм C++ в действии.

Можно ли что-нибудь добавить теперь, когда C++ 11 отсутствует? Я могу представить, что теперь мы можем использовать семантику перемещения?

Damian 16.03.2014 12:26

Да, вы можете использовать семантику перемещения с std::thread и std::async.

Anthony Williams 17.03.2014 13:37

Когда вы говорите «как новые стандарты C++ упрощают» параллельное программирование, я предполагаю, что вы говорите о скором (?) Выпуске стандарта C++ 09.

Новый стандарт в том виде, в каком он сейчас представлен в виде проекта, поддерживает следующие элементы, которые помогают при параллельном программировании:

  • атомарные типы и адреса
  • класс потока
  • хранилище thread_local (которое было добавлено в черновой вариант стандарта несколько месяцев назад)
  • взаимное исключение (классы мьютексов)
  • условные переменные - это особенно удобно для Windows, поскольку условные переменные сложно правильно реализовать в Win32. Это означает, что в конечном итоге Microsoft должна обеспечить поддержку условных переменных по крайней мере в среде выполнения MSVC++, так что будет легко получить правильную семантику условных переменных в WIn32.

Кто-нибудь еще написал хорошее резюме об этих функциях?

Martin York 20.10.2008 19:58

Я думаю, что они в значительной степени основаны на boost :: thread, поэтому между этой документацией и новым стандартом не должно быть большой разницы.

gbjbaanb 20.10.2008 20:09

Мой немного другой подход, специфичный для будущих направлений парадигм программирования:

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

По мере улучшения оборудования оно будет улучшаться по горизонтали (больше ядер), а не по вертикали (более быстрое одно ядро). Это означает, что приложениям потребуется «скрытый параллелизм» для масштабирования с помощью «более быстрого» оборудования. Языки в настоящее время пытаются развиваться, чтобы наилучшим образом поддерживать это, чтобы быть лучшим языком для будущего развития.

В C++ 0x добавлена ​​дополнительная встроенная поддержка «старых» методов параллелизма программирования. Различные поставщики компиляторов добавляют «новые» методы, которые абстрагируют модель потоков и позволяют во время выполнения принимать решения о количестве потоков и т. д. (На основе аппаратного обеспечения машины); для Microsoft, в частности, см. F#, среду выполнения параллелизма, параллельные расширения и т. д.

Надеюсь, это поможет.

C++ CSP2 - простой параллелизм для C++

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

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

(См. Occam-Pi для языка параллельного программирования (также на основе CSP))

Это лучшая статья для понимания параллельного программирования: Параллельное программирование

После прочтения вы получите полное представление о параллельном программировании и C++.

Вкратце, мы можем сказать, что параллельное программирование - это многозадачность. Когда программа блокируется, она может делать другие вещи. Обычно мы блокируемся во время ожидания сетевых подключений и операций ввода-вывода. Мы можем облегчить параллельное программирование, используя fork() и библиотеки потоков.

Отправленная вами ссылка возвращает ошибку 404.

xyres 25.09.2017 17:46

Другие вопросы по теме