Ява.утиль.библиотека параллельных и повышающих потоков
Как библиотеки потоков 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: java.утиль.Нить)
- Блокировка (Java:java.ленг.Объект и java.утиль.параллельный.замки!--2-->)
- Переменные Условия (Java. java.ленг.Объект и java.утиль.параллельный)
- Барьер (Java:барьер)
java.утиль.одновременно также:
- семафоры
- читатель-писатель замки
- параллельные структуры данных, например a BlockingQueue или одновременная карта хэша без блокировки.
- на исполнитель услуги, как гибкий производитель потребитель система.
- атомные операции.
Примечание: 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", чтобы увидеть.