Я постоянно слышу о параллельной программировании. Можете ли вы, ребята, рассказать о том, что он и как упрощают новые стандарты на С++?
Параллельное программирование С++?
Ответ 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.
Ответ 3
Возможно, это видео может помочь осветить для вас свет:-)
http://channel9.msdn.com/posts/Charles/The-Concurrency-Runtime-Fine-Grained-Parallelism-for-C/
Ответ 4
Concurrency имеет несколько потоков выполнения для данного процесса. На сегодняшний день С++ напрямую не поддерживает его. Однако существует несколько библиотек, которые привяжут заданную функцию к новому потоку выполнения. Стандарт Unix представляет собой библиотеку pthreads.
Ответ 5
С++ CSP2 - Easy Concurrency для С++
http://www.cs.kent.ac.uk/projects/ofa/c++csp/
CSP основан на правильной параллельной парадигме, а не на потоках и замках, а также на других способах, которые накладываются как на мысль.
(См. Occam-Pi для параллельного языка программирования (также на основе CSP))
Ответ 6
Статьи: ознакомьтесь с этими статьями о concurrency
Ответ 7
Мой немного другой подход, характерный для будущих направлений программирования парадигм:
Concurrency заключается в написании вашей программы, чтобы она могла выполнять сразу несколько действий, если аппаратное обеспечение поддерживает ее. В настоящее время большинство языков имеют довольно тяжелые и сложные механизмы, позволяющие программисту указать это (например: потоки с ручной синхронизацией, предпроцессорные директивы OpenMP и т.д.).
По мере улучшения аппаратного обеспечения он будет улучшаться горизонтально (больше ядер), а не вертикально (быстрее одноядерный). Это означает, что приложения должны иметь "скрытый concurrency" для масштабирования с помощью "более быстрого" оборудования. Языки в настоящее время пытаются развиваться, чтобы наилучшим образом поддержать это, чтобы быть в положении лучшего языка для будущего развития.
С++ 0x добавляет дополнительную встроенную поддержку "старых" методов программирования concurrency. Различные поставщики компиляторов добавляют "новые" методы, которые абстрагируют модель потоков и позволяют принимать во времени решения о количестве потоков и т.д. (На основе аппаратного обеспечения машины); для Microsoft, в частности, см. F #, concurrency время исполнения, параллельные расширения и т.д.
Надеюсь, что это поможет.
Ответ 8
Это лучшая статья для понимания параллельного программирования: Параллельное программирование
Вы получите полную картину параллельного программирования и С++ после прочтения.
В качестве краткого резюме можно сказать, что параллельное программирование - это многозадачность. Когда программа блокируется, она может делать другие вещи. Как правило, мы блокируемся в ожидании сетевых подключений и работе с I/O. Мы можем облегчить параллельное программирование с помощью fork()
и библиотек потоков.