Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

Буст -потоки обеспечивают:

java.util.concurrent также есть:

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

Производительность, я бы на самом деле не волновался. Это мое ощущение, что эксперт Boost/C ++ может написать более быстрый код, чем эксперт Java. Но за любые преимущества должны были бороться.

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

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

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

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

Эта книга обязательна к прочтению: Ява параллелизм на практике

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top