Многопоточность в C++ …, где запустить?

Я хотел бы начать изучать многопоточность в C++. Я изучаю это в Java также. В Java, если я пишу программу, которая использует многопоточность, она будет работать где угодно. Однако в C++, разве многопоточность не полагается на определенный для платформы API? Если так, это, казалось бы, помешало бы мобильности.

Как я могу сделать многопоточность в C++, не вызывая проблемы мобильности? Действительно ли библиотека потока повышения является хорошим решением?

Как заметка на полях - как даже возможно реализовать многопоточность как библиотеку? Не то, что что-то, что должно быть сделано компилятором?

14
задан Cam 26 June 2010 в 17:35
поделиться

8 ответов

Если у вас еще нет компилятора, который поддерживает C ++ 0x (например, доступен в Visual Studio C ++ 2010), используйте потоки ускорения. (Если вы не используете фреймворк, который уже поддерживает многопоточность, что не так - иначе вы бы не задавали вопрос -). Эти потоки ускорения стали фактически стандартом в новом C ++. До этого времени сам C ++ не знал о потоках.

Строительные блоки TBB Threading также могут быть интересны вам, если вы хотите изучить другие аспекты параллельного программирования.

Относительно Qt : если вам нужна только поддержка многопоточности, это полный перебор. У него ужасно медленное время пути туда и обратно от компиляции до результата. Это действительно хорошо продуманная мысль. Но это не официальный стандарт, такой как потоки C ++ 0x от boost. Поэтому я бы не стал считать это первым выбором.

15
ответ дан 1 December 2019 в 09:00
поделиться

Давайте начнем в обратном направлении:

Как можно реализовать многопоточность в библиотеке?

Этого нет, по крайней мере, не в (чистом) C ++. Для этого требуется поддержка языка (компилятор - это всего лишь реализация).

В настоящее время используются 2 вещи:

  • ассемблерный код для некоторых частей (например, в библиотеке pthread )
  • конкретные инструкции компилятора для других (в зависимости от компилятора и платформы)

Оба являются хрупкими и требуют огромных усилий для переносимости. В основном это означает множество частей кода #ifdef для проверки компилятора и целевой архитектуры, проверки поддержки некоторых директив и т. Д.

Вот почему было сочтено необходимым добавить многопоточность поддержка в C ++ 0x.

Как сделать многопоточность?

Еще до того, как вы выберете библиотеку, вы должны выбрать метод.Есть 2 способа программирования многопоточных приложений (и вы можете комбинировать их):

  • Общение посредством совместного использования : это означает использование мьютексов, атомарных операций и т. Д. Вы можете использовать pthread в Linux платформ, но я бы порекомендовал Boost.Thread (среди прочих) из-за его переносимости.
  • Делитесь, сообщая : более новый и адаптированный для распределенных вычислений, это проистекает из функциональных языков. Это означает передачу сообщений из одного потока в другой без совместного использования каких-либо ресурсов. Вы можете использовать FastFlow или Intel Thread Building Blocks или TBB .

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

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

4
ответ дан 1 December 2019 в 09:00
поделиться

также проверьте Qt

1
ответ дан 1 December 2019 в 09:00
поделиться

Чтобы предложить предложение, отличное от Boost, я использую Pthreads (или Pthreads-Win32 в Windows). Это очень простая библиотека, которую можно сделать самим, но она предоставляет вам все, что вам нужно, и ничего больше. Он очень легкий по сравнению с Boost, и вы можете легко найти вокруг него оболочки C ++, чтобы предоставить вам абстракции более высокого уровня.

1
ответ дан 1 December 2019 в 09:00
поделиться

Если вы делаете это из интереса, чтобы улучшить свои знания различных моделей программирования и языковые навыки, тогда библиотека Boost будет отличным вариантом. Однако я бы долго и усердно думал о создании любых производственных приложений с использованием многопоточного C ++.

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

Императивные языки, такие как C ++, Java или C # (с их изменяемыми переменными, разделяемой памятью и примитивами блокировки / сигнализации), очень часто являются наименее доступным способом создания многопоточных приложений.Обычно существуют прекрасные варианты однопоточной реализации для решения большинства проблем пользовательского пространства (в отличие от ядра или встроенных) приложений, в том числе на многоядерных машинах.

Если вы действительно хотите создавать надежные «многопоточные» приложения, я бы посоветовал вам изучить функциональные языки, такие как Erlang, Haskell, F # или Clojure.

0
ответ дан 1 December 2019 в 09:00
поделиться

вы также можете рассмотреть openmp http://openmp.org . Его поддерживают многие компиляторы, включая MS, GCC / G ++ и Intel. Хотя вы не получаете явного управления потоками, его более высокая абстракция параллелизма иногда более эффективна (как во время кодирования, так и во время выполнения), и код намного легче понять. Если вы работаете с графическим интерфейсом, это вам не очень поможет, но для масштабируемых вычислений на это стоит обратить внимание.

1
ответ дан 1 December 2019 в 09:00
поделиться

В C ++ да, многопоточность зависит от платформы. Однако многие библиотеки потоковой передачи инкапсулируют нюансы потоковой передачи на различных платформах, предоставляя единый API для написания потокового приложения, поэтому вам не нужно беспокоиться о деталях, связанных с конкретной платформой.

Библиотека Boost threading - очень хорошее решение.

Я также рекомендую проверить ACE .

4
ответ дан 1 December 2019 в 09:00
поделиться

Библиотека Boost Threading Library, вероятно, лучшее место для начала работы с C++. Она предоставляет вам потоковые структуры, а также все мьютексы и объекты управления, необходимые для написания реального рабочего многопоточного приложения.

1
ответ дан 1 December 2019 в 09:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: