Я хотел бы начать изучать многопоточность в C++. Я изучаю это в Java также. В Java, если я пишу программу, которая использует многопоточность, она будет работать где угодно. Однако в C++, разве многопоточность не полагается на определенный для платформы API? Если так, это, казалось бы, помешало бы мобильности.
Как я могу сделать многопоточность в C++, не вызывая проблемы мобильности? Действительно ли библиотека потока повышения является хорошим решением?
Как заметка на полях - как даже возможно реализовать многопоточность как библиотеку? Не то, что что-то, что должно быть сделано компилятором?
Если у вас еще нет компилятора, который поддерживает C ++ 0x (например, доступен в Visual Studio C ++ 2010), используйте потоки ускорения. (Если вы не используете фреймворк, который уже поддерживает многопоточность, что не так - иначе вы бы не задавали вопрос -). Эти потоки ускорения стали фактически стандартом в новом C ++. До этого времени сам C ++ не знал о потоках.
Строительные блоки TBB Threading также могут быть интересны вам, если вы хотите изучить другие аспекты параллельного программирования.
Относительно Qt
: если вам нужна только поддержка многопоточности, это полный перебор. У него ужасно медленное время пути туда и обратно от компиляции до результата. Это действительно хорошо продуманная мысль. Но это не официальный стандарт, такой как потоки C ++ 0x от boost. Поэтому я бы не стал считать это первым выбором.
Давайте начнем в обратном направлении:
Как можно реализовать многопоточность в библиотеке?
Этого нет, по крайней мере, не в (чистом) C ++. Для этого требуется поддержка языка (компилятор - это всего лишь реализация).
В настоящее время используются 2 вещи:
pthread
) Оба являются хрупкими и требуют огромных усилий для переносимости. В основном это означает множество частей кода #ifdef
для проверки компилятора и целевой архитектуры, проверки поддержки некоторых директив и т. Д.
Вот почему было сочтено необходимым добавить многопоточность поддержка в C ++ 0x.
Как сделать многопоточность?
Еще до того, как вы выберете библиотеку, вы должны выбрать метод.Есть 2 способа программирования многопоточных приложений (и вы можете комбинировать их):
pthread
в Linux платформ, но я бы порекомендовал Boost.Thread
(среди прочих) из-за его переносимости. TBB
. Вы можете объединить два, но лучше не делать этого. Лично я нашел описание FastFlow совершенно потрясающим: он поощряет программирование без блокировок. Кроме того, основным преимуществом второго метода является то, что он лучше адаптирован к многопроцессорному программированию и масштабируется для распределенных сред.
Для начала я бы порекомендовал сосредоточиться на любом из них и создать на нем несколько приложений. Когда вам будет удобно, вы можете попробовать другое, но будьте готовы начать все сначала, они совсем другие.
Чтобы предложить предложение, отличное от Boost, я использую Pthreads (или Pthreads-Win32 в Windows). Это очень простая библиотека, которую можно сделать самим, но она предоставляет вам все, что вам нужно, и ничего больше. Он очень легкий по сравнению с Boost, и вы можете легко найти вокруг него оболочки C ++, чтобы предоставить вам абстракции более высокого уровня.
Если вы делаете это из интереса, чтобы улучшить свои знания различных моделей программирования и языковые навыки, тогда библиотека Boost будет отличным вариантом. Однако я бы долго и усердно думал о создании любых производственных приложений с использованием многопоточного C ++.
C ++ временами достаточно сложен, чтобы добиться корректности без добавления значительной сложности многопоточности с разделяемой памятью. Даже самые опытные программисты согласятся, что многопоточные программы чрезвычайно сложно разобраться и разобраться в них. Даже самые простые программы могут быстро стать трудными для тестирования и отладки в многопоточном режиме.
Императивные языки, такие как C ++, Java или C # (с их изменяемыми переменными, разделяемой памятью и примитивами блокировки / сигнализации), очень часто являются наименее доступным способом создания многопоточных приложений.Обычно существуют прекрасные варианты однопоточной реализации для решения большинства проблем пользовательского пространства (в отличие от ядра или встроенных) приложений, в том числе на многоядерных машинах.
Если вы действительно хотите создавать надежные «многопоточные» приложения, я бы посоветовал вам изучить функциональные языки, такие как Erlang, Haskell, F # или Clojure.
вы также можете рассмотреть openmp http://openmp.org . Его поддерживают многие компиляторы, включая MS, GCC / G ++ и Intel. Хотя вы не получаете явного управления потоками, его более высокая абстракция параллелизма иногда более эффективна (как во время кодирования, так и во время выполнения), и код намного легче понять. Если вы работаете с графическим интерфейсом, это вам не очень поможет, но для масштабируемых вычислений на это стоит обратить внимание.
В C ++ да, многопоточность зависит от платформы. Однако многие библиотеки потоковой передачи инкапсулируют нюансы потоковой передачи на различных платформах, предоставляя единый API для написания потокового приложения, поэтому вам не нужно беспокоиться о деталях, связанных с конкретной платформой.
Библиотека Boost threading - очень хорошее решение.
Я также рекомендую проверить ACE .
Библиотека Boost Threading Library, вероятно, лучшее место для начала работы с C++. Она предоставляет вам потоковые структуры, а также все мьютексы и объекты управления, необходимые для написания реального рабочего многопоточного приложения.