Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Новый стандарт С++ 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)
  • promises и упакованные задачи для упрощения передачи данных между потоками и ожидания готовности значения. Это касается классического вопроса "как мне вернуть значение из потока".
  • потокобезопасная инициализация локальных статических объектов
  • ключевое слово thread_local для объявления локальных данных потока

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

Я пишу о многопоточности и concurrency в С++ на в моем блоге. Я также пишу книгу по теме: С++ concurrency в действии.

Ответ 2

Когда вы говорите "как упрощают новые стандарты С++ новые стандарты", я предполагаю, что вы говорите о скором (?), который должен быть выпущен стандартом С++ 09.

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

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

Ответ 4

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

Ответ 5

С++ CSP2 - Easy Concurrency для С++

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

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

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

Ответ 7

Мой немного другой подход, характерный для будущих направлений программирования парадигм:

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

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

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

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

Ответ 8

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

Вы получите полную картину параллельного программирования и С++ после прочтения.

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