Библиотека java.util.concurrent vs. Boost Threads - PullRequest
11 голосов
/ 18 ноября 2009

Как библиотеки Boost Thread сравниваются с библиотеками java.util.concurrent?

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

Недавно я слышал, что в JDK 1.5 модель памяти Java была изменена, чтобы исправить некоторые проблемы параллелизма. Как насчет C ++? В последний раз я занимался многопоточным программированием на C ++ 3-4 года назад, когда использовал pthreads. Хотя я больше не хочу использовать это для большого проекта. Единственная другая альтернатива, которую я знаю, это Boost Threads. Однако я не уверен, что это хорошо. Я слышал хорошие новости о java.util.concurrent, но пока ничего о потоках Boost.

Ответы [ 6 ]

12 голосов
/ 26 декабря 2009

java.util.concurrent и библиотека потоков повышения имеют перекрывающуюся функциональность, но java.util.concurrent также предоставляет а) абстракции более высокого уровня и б) также функции более низкого уровня.

Повышающие потоки обеспечивают:

java.util.concurrent также имеет:

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

11 голосов
/ 19 ноября 2009

Повышающие потоки намного проще в использовании, чем pthreads, и, на мой взгляд, несколько проще в использовании, чем потоки Java. Когда создается объект потока-буста, он запускает новый поток. Пользователь предоставляет функцию или объект функции, которые будут выполняться в этом новом потоке.

Это действительно так просто, как:

boost::thread* thr = new boost::thread(MyFunc());
thr->join();

Вы можете легко передавать данные в поток, сохраняя значения внутри объекта функции. А в последней версии boost вы можете передать переменное число аргументов самому конструктору потока, который затем будет передан оператору () вашего функционального объекта.

Вы также можете использовать блокировки типа RAII с boost::mutex для синхронизации.

Обратите внимание, что C ++ 0x будет использовать тот же синтаксис для std::thread.

7 голосов
/ 19 ноября 2009

Производительность мудрая, я бы на самом деле не волновался. Мне кажется, что специалист по boost / c ++ мог бы писать код быстрее, чем java. Но за любые преимущества придется бороться.

Я предпочитаю парадигмы дизайна Boost по сравнению с Java. Java полностью OO, где Boost / C ++ допускает OO, если хотите, но использует наиболее полезную парадигму для рассматриваемой проблемы. В частности, я люблю RAII при работе с замками. Java прекрасно справляется с управлением памятью, но иногда кажется, что остальная часть ресурсов программистов искажается: файловые дескрипторы, мьютексы, БД, сокеты и т. Д.

Параллельная библиотека Java более обширна, чем Boost. Пулы потоков, параллельные контейнеры, атомарные элементы и т. Д. Но основные примитивы находятся на одном уровне друг с другом: потоки, мьютексы, условные переменные.

Так что для исполнения я бы сказал, что это стирка. Если вам нужно много одновременной поддержки библиотек высокого уровня, Java победит. Если вы предпочитаете свободу парадигмы C ++.

4 голосов
/ 11 мая 2011

Если производительность является проблемой в вашей многопоточной программе, то вы должны рассмотреть дизайн без блокировки.
Без блокировки означает, что потоки не конкурируют за общий ресурс, и это минимизирует затраты на переключение. В этом отделе у Java есть лучшая история IMHO с ее параллельными коллекциями. Вы можете быстро найти решение без блокировки.
Поскольку я немного использовал Boost Thread lib (но не широко), я могу сказать, что на ваше мышление будет влиять то, что доступно, а это, по сути, означает решение для блокировки.
Написание решения C ++ без блокировок очень сложно из-за отсутствия поддержки библиотеки, а также из-за концептуальности, поскольку в ней отсутствует модель памяти, которая гарантирует, что вы можете писать действительно неизменяемые объекты.

эта книга обязательна для чтения: Параллелизм Java на практике

1 голос
/ 18 ноября 2009

Если вы ориентируетесь на конкретную платформу, то прямой вызов ОС, вероятно, будет немного быстрее, чем использование boost для C ++. Я бы предпочел использовать ACE, так как вы обычно можете делать правильные вызовы для своей основной платформы, и она все равно будет независимой от платформы. Скорость Java должна быть примерно одинаковой, если вы можете гарантировать, что она будет работать в последней версии.

0 голосов
/ 22 июня 2010

В C ++ можно напрямую использовать pthreads (pthread_create () и т. Д.), Если хотите. Внутренне Java использует pthreads через среду выполнения. Сделайте "ldd", чтобы увидеть.

...