2010-12-15 17 views
19

Estoy trabajando con una base de código C++ de tamaño medio que actualmente es completamente de un solo subproceso. Sin embargo, ha llegado el momento de buscar la simultaneidad y el paralelismo para el aumento del rendimiento. Estoy muy interesado en el modelo de simultaneidad del lenguaje de programación Go de Google, con rutinas muy livianas y un sistema de canales de comunicación.bibliotecas de C++ que implementan Go rutinas o Go canales?

Lamentablemente, por una variedad de razones perfectamente válidas, el proyecto debe permanecer en C++. Entonces mi pregunta es: ¿hay una biblioteca C++ que se aproxime al paradigma Go para el paralelismo? Específicamente, ¿hay una aproximación de goroutines o go channels disponible para C++? Mi plan de respaldo es solo usar boost :: thread.

La aplicación en cuestión es una simulación patentada de larga duración para el dominio de previsión financiera. Por lo general, está vinculado a la CPU, pero también se bloquea en IO cuando hay nuevos datos disponibles. Muchos de los cálculos involucrados no dependen de resultados previos y podrían hacerse fácilmente para que se ejecuten en paralelo. Poder ejecutar la aplicación en un contexto distribuido es un objetivo a largo plazo, pero no uno que deba resolverse de inmediato.

+1

Pregunta similar: http://stackoverflow.com/questions/2190231/looking-for-ac-or-c-library-providing-a-functionality-similar-to-google-gos-c – JimR

+0

¿Cómo son similares? ? –

+0

Realmente necesita ser más específico acerca de su proyecto. Diversos tipos de aplicaciones beneficiarán (o no) diferentes modelos de subprocesamiento. Sea que las corutinas (que son básicamente las rutinas) o los hilos; quizás un modelo de evento es más adecuado, o una de las diversas bibliotecas de actores. ** Describa su aplicación **. – jer

Respuesta

4

Si su objetivo es acelerar el cálculo, Intel TBB (Threading Building Blocks) es (en mi humilde opinión) una mejor opción que rodar su propia versión inferior desde boost::thread.

+1

TBB parece una buena opción, pero solo elegiría si estuviera convencido de que no hay una biblioteca equivalente que podamos usar de forma gratuita. –

+0

TBB * is * free: hay una versión que se distribuye bajo Apache Public License en el sitio vinculado. –

3

This question y, en general, una búsqueda en google de "corutinas C++" debería darle algo cercano. La pregunta SO sugiere probar Boost :: coroutine.

Si no te importa envolver C, podría poder probar libtask. Que fue escrito por Russ Cox (uno de los equipos oficiales de desarrollo Go) antes de que comenzara el trabajo en Go. Solo lo he usado en C, así que no sé si es aplicable.

Los canales Go se implementan como colas de bloqueo por cierto, por lo que es posible que pueda incorporar un mecanismo similar con hilos normales.

+0

Parece que libtask se mudó. Parece que se puede encontrar un tenedor en GitHub en https://github.com/jamwt/libtask –

+0

@RichardChambers Parece que se ha movido a https://swtch.com/libtask/ ahora, he actualizado la publicación – cthom06

2

Pruebe GBL library, tiene de todo: coroutines (fibras), hilos, sincronizadores y manipuladores asíncronos - y todo es C++ moderno.

1

Por lo que he visto hasta ahora, cilk parece ser bastante similar al estilo de paralelismo de go. Parece que Intel lo ha comprado y proporciona soporte comercial con Intel Cilk Plus.