Библиотека 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", чтобы увидеть.