Pregunta

¿Cómo funcionan las bibliotecas Boost de rosca comparan contra las librerías java.util.concurrent?

El rendimiento es crítico y por lo que preferiría quedarse con C ++ (aunque Java es mucho más rápido en estos días). Teniendo en cuenta que tengo que codificar en C ++, lo que las bibliotecas existen para enhebrar error fácil y menos propenso.

He oído recientemente que a partir del JDK 1.5, el modelo de memoria de Java se cambió para corregir algunos problemas de concurrencia. ¿Qué hay de C ++? La última vez que hice la programación multihilo en C ++ fue hace 3-4 años cuando solía pthreads. Aunque, no deseo utilizar más que para un gran proyecto. La única alternativa que yo sepa es Boost Hilos. Sin embargo, no estoy seguro de si es bueno. He oído cosas buenas sobre java.util.concurrent, pero nada todavía acerca de las discusiones de Boost.

¿Fue útil?

Solución

Los hilos de Boost son mucho más fáciles de usar que pthreads, y, en mi opinión, un poco más fácil de usar que las hebras Java. Cuando se crea una instancia de un objeto hilo impulso, pone en marcha un nuevo hilo. El usuario suministra un objeto función o función que se desarrollará 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 función. Y en la última versión del impulso, se puede pasar un numero variable de argumentos a la propia constructora hilo, que luego pasó a ser operador () de su objeto función.

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

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

Otros consejos

impulsar librería de hilos tienen una funcionalidad de solapamiento, pero también proporcionan java.util.concurrent a) abstracciones de nivel superior y b) las funciones de nivel también más bajos.

hilos Boost proporcionan:

java.util.concurrent tiene también:

Una nota al margen: C ++ tiene actualmente ningún modelo de memoria. En una máquina diferente de la misma aplicación C ++ puede tener que hacer frente a un modelo de memoria diferente. Esto hace que la programación portátil, concurrente en C ++ aún más complicado.

En cuanto al rendimiento que sería en realidad no se preocupe. Es mi presentimiento de que un / C ++ experto impulso podría escribir código más rápido que un experto en java. Pero ninguna ventaja tendrían que luchar.

Yo prefiero paradigmas de diseño de impulso a Java. Java es OO hasta el final, donde Boost / C ++ permite OO si quieres, pero utiliza el paradigma más útil para el problema en cuestión. En particular me encanta RAII cuando se trata de cerraduras. Java se encarga de la gestión de memoria muy bien, pero a veces se siente como el resto de los recursos de los programadores hacerse follar: identificadores de archivo, exclusiones mutuas, DB, tomas de corriente, etc.

biblioteca concurrente de Java es más extensa que la del refuerzo del. Agrupaciones de hebras, contenedores concurrentes, atómica, etc., pero las primitivas de núcleo están a la par con cada uno de otros, hilos, mutex, variables de condición.

Así que para el rendimiento de E diría que es un lavado. Si necesita mucho apoyo biblioteca concurrente alto nivel gana Java. Si prefiere paradigma de la libertad ++ C.

Si el rendimiento es un problema en su programa de multiproceso, entonces usted debería considerar un diseño libre de bloqueo.
hilos lock-libre significa no compiten por un recurso compartido y que minimiza los costes de cambio. En ese departamento, Java tiene una mejor historia en mi humilde opinión, con sus colecciones concurrentes. Usted puede venir rápidamente con una solución libre de bloqueo.
Por haber utilizado el hilo Boost lib un poco (pero no exhaustivamente), puedo decir que su pensamiento se verá influido por lo que está disponible, y que en esencia significa una solución de bloqueo.
Escribir un C sin bloqueo solución ++ es muy difícil, debido a la falta de apoyo biblioteca y también conceptualmente, porque le falta un modelo de memoria que garantiza que puede escribir objetos verdaderamente inmutables.

Este libro es una lectura obligada: Java concurrencia en la práctica

Si se orienta a una plataforma específica entonces la llamada directa OS probablemente será un poco más rápido que el uso de impulso para C ++. Yo tiendo a usar ACE, ya que por lo general puede hacer las llamadas correctas para su plataforma principal y seguirá siendo independiente de la plataforma. Java debe ser aproximadamente la misma velocidad tanto tiempo como se puede garantizar que va a estar funcionando en una versión reciente.

En C ++ se puede utilizar directamente pthreads (pthread_create (), etc) si uno quería. Internamente Java utiliza pthreads a través de su entorno de tiempo de ejecución. Hacer "LDD" para ver.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top