Библиотека java.util.concurrent vs. Boost Threads
Как библиотеки Boost Thread сравниваются с библиотеками java.util.concurrent?
Производительность имеет решающее значение, поэтому я бы предпочел остаться с С++ (хотя в наши дни Java намного быстрее). Учитывая, что мне нужно кодировать на С++, какие библиотеки существуют, чтобы сделать потоки легкими и менее подверженными ошибкам.
Недавно я слышал, что с JDK 1.5 модель памяти Java была изменена, чтобы исправить некоторые проблемы concurrency. Как насчет С++? Последний раз, когда я делал многопоточное программирование на С++, было 3-4 года назад, когда я использовал pthreads. Хотя, я больше не хочу использовать это для большого проекта. Единственная альтернатива, которую я знаю, это Boost Threads. Однако я не уверен, что это хорошо. Я слышал хорошие вещи о java.util.concurrent, но ничего не сказал о потоках Boost.
Ответы
Ответ 1
Повысить потоки намного проще в использовании, чем pthreads, и, на мой взгляд, немного проще в использовании, чем потоки Java. Когда создается экземпляр объекта boost, он запускает новый поток. Пользователь поставляет объект функции или функции, который будет запускаться в этом новом потоке.
Это действительно так просто:
boost::thread* thr = new boost::thread(MyFunc());
thr->join();
Вы можете легко передавать данные в поток, сохраняя значения внутри объекта функции. И в последней версии boost вы можете передать переменное количество аргументов самому конструктору потока, который затем будет передан вашему оператору объекта ()
.
Вы также можете использовать блокировки типа RAII с boost::mutex
для синхронизации.
Обратите внимание, что С++ 0x будет использовать тот же синтаксис для std::thread
.
Ответ 2
java.util.concurrent и поддержка библиотеки потоков имеют перекрывающиеся функциональные возможности, но java.util.concurrent также обеспечивает: а) абстракции более высокого уровня и б) также функции нижнего уровня.
Повышающие потоки обеспечивают:
java.util.concurrent также:
Замечание: С++ в настоящее время не имеет модели памяти. На другой машине одно и то же приложение на С++ может иметь дело с другой моделью памяти. Это делает переносимое, параллельное программирование на С++ еще более сложным.
Ответ 3
Эффективность, я бы не волновался. Мне кажется, что эксперт boost/С++ может писать быстрее код, чем эксперт java. Но за все это можно было бы бороться.
Я предпочитаю парадигмы проектирования Boost для Java. Java полностью OO, где Boost/С++ допускает OO, если вам нравится, но использует наиболее полезную парадигму для данной проблемы. В частности, я люблю RAII при работе с замками. Java прекрасно справляется с управлением памятью, но иногда кажется, что остальные ресурсы программистов получают вал: файловые дескрипторы, мьютексы, DB, сокеты и т.д.
Java-параллельная библиотека более обширна, чем Boost. Пулы потоков, параллельные контейнеры, атомы и т.д. Но основные примитивы находятся на одном уровне друг с другом, потоки, мьютексы, переменные условия.
Поэтому для выступления я бы сказал, что это мойка. Если вам нужно много поддержки параллельной библиотеки на высоком уровне, выигрывает Java. Если вы предпочитаете свободу парадигмы С++.
Ответ 4
Если производительность является проблемой в вашей многопоточной программе, тогда вы должны рассмотреть возможность блокировки.
Не зависящие от потока потоки не конкурируют за общий ресурс и минимизируют затраты на коммутацию. В этом отделе Java имеет лучшую историю IMHO с ее параллельными коллекциями. Вы можете быстро найти решение без блокировки.
Поскольку я использовал бит Boost Thread немного (но не широко), могу сказать, что ваше мышление будет зависеть от того, что доступно, и это означает, по сути, решение для блокировки.
Написание бесплатного С++-решения очень сложно из-за отсутствия поддержки библиотеки, а также концептуально, потому что у него отсутствует модель памяти, которая гарантирует, что вы можете писать действительно неизменные объекты.
эта книга обязательна: Java Concurrency на практике
Ответ 5
Если вы ориентируетесь на определенную платформу, прямой вызов ОС, вероятно, будет немного быстрее, чем использование boost для С++. Я хотел бы использовать ACE, так как вы можете в целом сделать правильные вызовы для своей основной платформы, и он по-прежнему будет не зависящим от платформы. Java должна иметь одинаковую скорость, пока вы можете гарантировать, что она будет работать в последней версии.
Ответ 6
В С++ можно напрямую использовать pthreads (pthread_create() и т.д.), если захотите. Внутри Java использует pthreads через среду выполнения. Сделайте "ldd", чтобы увидеть.