Ява.утиль.библиотека параллельных и повышающих потоков

Как библиотеки потоков Boost сравниваются с java.утиль.параллельные библиотеки?

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

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

6 ответов


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

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

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

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

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

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


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

увеличить потоки обеспечивают:

java.утиль.одновременно также:

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


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

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

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

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


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

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


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


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