2009-11-18 16 views
10

¿Cómo se comparan las bibliotecas Boost Thread con las bibliotecas java.util.concurrent?java.util.concurrent vs. Boost Threads library

El rendimiento es crítico, por lo que preferiría quedarme con C++ (aunque Java es mucho más rápido actualmente). Dado que tengo que codificar en C++, ¿qué bibliotecas existen para que el enhebrado sea más fácil y menos propenso a errores?

He oído recientemente que, a partir de JDK 1.5, se modificó el modelo de memoria de Java para corregir algunos problemas de simultaneidad. ¿Qué hay de C++? La última vez que hice la programación multiproceso en C++ fue hace 3-4 años cuando utilicé pthreads. Aunque, no deseo usar eso más para un gran proyecto. La única otra alternativa que conozco es Boost Threads. Sin embargo, no estoy seguro de si es bueno. He escuchado cosas buenas sobre java.util.concurrent, pero aún nada sobre los hilos de Boost.

+7

Martin, creo que significa "Java es mucho más rápido de lo que era antes." – zedoo

+7

En mi experiencia cada vez que alguien dice "El rendimiento es crítico" sin detalles, en realidad no es tan crítico. No elija C++ o Java por motivos de rendimiento, elija C++ o Java porque está más familiarizado con él o le resulta más fácil programar. –

Respuesta

10

Los hilos Boost son mucho más fáciles de usar que los pthreads, y, en mi opinión, son ligeramente más fáciles de usar que los hilos Java. Cuando se crea una instancia de un objeto de subproceso de subproceso, se inicia un nuevo subproceso. El usuario proporciona una función u objeto de función que se ejecutará en ese nuevo hilo.

Es realmente tan simple como:

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

Puede pasar fácilmente los datos a la rosca mediante el almacenamiento de los valores dentro del objeto de función. Y en la última versión de boost, puede pasar una cantidad variable de argumentos al propio constructor de subprocesos, que luego pasará al operador () del objeto de función.

También puede usar bloqueos de estilo RAII con boost::mutex para la sincronización.

Tenga en cuenta que C++ 0x utilizará la misma sintaxis para std::thread.

+1

En mi humilde opinión El propósito de las bibliotecas de concurrencia de Java es hacer el multi-threading más fácil que planificar los hilos de Java (que se basan en pthreads) –

+0

@PeterLawrey ¿Qué pasa con pthreads? A menos que estuvieras hablando de colecciones concurrentes en Java, entonces esas son imposibles en pthreads. –

+1

@IgorGanapolsky no hay nada de malo en pthreads. Estaba enfatizando que comparar Boost con hilos de Java no es lo mismo que comparar Boost con java.util.concurrent que se agregó en 2006 y que son mucho más fáciles. La API parallelStream() es mucho más fácil de nuevo. –

1

Si se dirige a una plataforma específica, entonces la llamada directa al sistema operativo probablemente será un poco más rápida que usar boost para C++. Tiendo a usar ACE, ya que generalmente puede hacer las llamadas correctas para su plataforma principal y seguirá siendo independiente de la plataforma. Java debería tener la misma velocidad, siempre que pueda garantizar que se ejecutará en una versión reciente.

+2

Boost.thread es más rápido que ACE por el único motivo de que boost utiliza plantillas. Both boost y ACE hacen uso de las mismas llamadas al sistema operativo. El código compilado de Boost, sin embargo, está muy cerca de lo que escribirías usando pthreads nativos. Mientras que ACE tiene que arrastrarse a través de capas de abstracción antes de que toque las primitivas nativas del sistema operativo. Java tendría un problema similar, pero la JVM puede eliminar la mayoría (¿todos?) De los costos de abstracción. –

+0

No olvide que ACE se centra en la comunicación multiplataforma y agrega muchas abstracciones de mayor nivel como el marco Reactor/Proactor. Entonces, desde ese punto de vista, puede ser preferible al impulso. – count0

7

Rendimiento sabio Realmente no me preocuparía. Es mi intuición de que un experto en boost/C++ podría escribir código más rápido que un experto de Java. Pero cualquier ventaja tendría que pelear por ella.

Prefiero los paradigmas de diseño de Boost a los de Java. Java es OO hasta el final, donde Boost/C++ permite OO si lo desea, pero utiliza el paradigma más útil para el problema en cuestión. En particular, me encanta RAII cuando se trata de bloqueos. Java maneja la administración de memoria maravillosamente, pero a veces se siente como el resto de los recursos de los programadores: sugerencias de archivos, mutexes, bases de datos, sockets, etc.

La biblioteca simultánea de Java es más extensa que la de Boost. Grupos de subprocesos, contenedores concurrentes, átomos atómicos, etc. Pero las primitivas de núcleo están a la par entre sí, subprocesos, mutexes, variables de condición.

Para el rendimiento, diría que es un lavado. Si necesita mucho soporte de biblioteca concurrente de alto nivel, Java gana. Si prefieres la libertad de paradigma C++.

12

java.util.concurrent y boost threads library tienen una funcionalidad de superposición, pero java.util.concurrent también proporciona a) abstracciones de mayor nivel yb) también funciones de nivel inferior.

hilos proporcionan Boost:

java.util.concurrent tiene también:

Una nota al pie: C++ no tiene actualmente ningún modelo de memoria. En una máquina diferente, la misma aplicación C++ puede tener que tratar con un modelo de memoria diferente. Esto hace que la programación portátil y concurrente en C++ sea aún más complicada.

0

En C++ uno puede usar directamente pthreads (pthread_create() etc) si uno quisiera. Internamente Java usa pthreads a través de su entorno de tiempo de ejecución. Haga "ldd" para ver.

4

Si el rendimiento es un problema en su programa multiproceso, entonces debe considerar un diseño sin cerrojo.
Sin bloqueo significa que los hilos no compiten por un recurso compartido y eso minimiza los costos de cambio. En ese departamento, Java tiene una mejor historia en mi humilde opinión, con sus colecciones concurrentes. Puede obtener rápidamente una solución sin bloqueo.
Por haber usado Boost Thread lib un poco (pero no exhaustivamente), puedo decir que su forma de pensar estará influenciada por lo que está disponible, y eso significa esencialmente una solución de bloqueo.
Escribir una solución C++ sin candado es muy difícil, debido a la falta de soporte de biblioteca y también conceptualmente porque le falta un modelo de memoria que le garantice que puede escribir objetos verdaderamente inmutables.

este libro es una lectura obligada: Java Concurrency in Practice