2008-10-20 42 views
41

Sigo escuchando acerca de la programación simultánea en todas partes. ¿Pueden arrojar algo de luz sobre lo que es y cómo los nuevos estándares C++ facilitan hacer lo mismo?Programación concurrente C++?

+3

Si la informática concurrente es nueva para usted, asegúrese de consultar algunos artículos básicos como http://en.wikipedia.org/wiki/Programación_concurrente. – lothar

Respuesta

68

La concurrencia se trata de su código haciendo varias cosas al mismo tiempo. Esto se hace típicamente con "hilos" explícitos, pero hay otras posibilidades. Por ejemplo, si usa directivas OpenMP en su código, entonces un compilador que admita OpenMP generará automáticamente subprocesos para usted.

El hilo es la abreviatura de "hilo de ejecución". En un programa de C++ de subproceso único, la ejecución comienza en main() y luego continúa de forma secuencial. En un programa de subprocesos múltiples, el primer subproceso comienza en main, pero la aplicación puede iniciar subprocesos adicionales que comienzan en una función especificada por el usuario. Estos se ejecutan al mismo tiempo o en paralelo con el hilo original.

en hilos 0x C++ se inician mediante la clase std::thread:

void my_function() 
{ 
    // do stuff 
} 
std::thread my_thread(my_function); // run my_function in its own thread 

El nuevo estándar C++ 0x también soporta:

  • valores atómicos y operaciones con la plantilla std::atomic<> clase,
  • mutex de protección de datos (std::mutex, std::recursive_mutex, etc.)
  • clases bloqueo fo r facilidad de gestión de toda la vida de bloqueo (std::lock_guard<>, std::unique_lock<>)
  • std::lock y std::try_lock funciones para gestionar la adquisición de múltiples cerraduras, al mismo tiempo sin el riesgo de estancamiento
  • variables de condición para aliviar la espera de un evento (std::condition_variable, std::condition_variable_any)
  • futuros , promesas y tareas empaquetadas para simplificar el paso de datos entre hilos y esperar que un valor esté listo. Esto aborda la clásica pregunta "¿cómo devuelvo un valor de un hilo?".
  • inicialización flujos seguros de objetos estática local
  • la thread_local palabra clave para declarar los datos de subproceso local

di una descripción más detallada de la nueva biblioteca de subprocesos C++ 0x en mi artículo sobre DevX. com: Simpler Multithreading in C++0x

escribo sobre multihilo y concurrencia en C++ en my blog. También estoy escribiendo un libro sobre el tema: C++ Concurrency in Action.

+1

¿Se puede agregar algo ahora que C++ 11 está disponible? ¿Me imagino que ahora podemos usar la semántica de movimiento? – Damian

+0

Sí, puede usar la semántica de movimiento con 'std :: thread' y' std :: async'. –

5

concurrencia es tener múltiples hilos de ejecución para un proceso dado. A partir de hoy, C++ no lo admite directamente. Sin embargo, existen varias bibliotecas que vincularán una función determinada con un nuevo hilo de ejecución. El estándar Unix es la biblioteca pthreads.

+1

El estándar Posix (no Unix) –

17

Cuando dices "cómo los nuevos estándares C++ facilitan" la programación concurrente, supongo que estás hablando de la próxima (?) Versión C++ 09 estándar.

El nuevo estándar tal y como está actualmente en fase de proyecto es compatible con los siguientes elementos que ayudan a la programación concurrente:

  • tipos atómicos y direcciones
  • una clase de hilo
  • almacenamiento thread_local (que se acaba de agregar en el proyecto de norma hace unos meses)
  • exclusión mutua (clases mutex)
  • variables de condición - esto es particularmente bueno para Windows, ya que Las variables de iones son difíciles de implementar correctamente en Win32. Esto significa que eventualmente Microsoft debería proporcionar soporte para las variables de condición al menos en el tiempo de ejecución de MSVC++, por lo que será fácil obtener la semántica de la variable de condición correcta en WIn32.
+0

¿Alguien ha escrito un buen resumen sobre estas características todavía? –

+0

Creo que están muy basados ​​en boost :: thread, por lo que no debería haber mucha diferencia entre esa documentación y el nuevo estándar. – gbjbaanb

3

Mi levemente diversa, específico para las futuras direcciones de paradigmas de programación:

concurrencia se trata de escribir su programa de tal manera que pueda estar haciendo varias cosas a la vez si el hardware lo soporta. Actualmente, la mayoría de los lenguajes tienen mecanismos bastante pesados ​​y complicados para permitir que el programador especifique esto (por ejemplo: hilos con sincronización manual, directivas de preprocesador OpenMP, etc.).

A medida que mejora el hardware, mejorará horizontalmente (más núcleos) en lugar de verticalmente (núcleo único más rápido). Esto significa que las aplicaciones necesitarán tener una "concurrencia latente" para escalar con hardware "más rápido". Actualmente, los idiomas están tratando de evolucionar para respaldar mejor esto, para estar en la posición de mejor lenguaje para el desarrollo futuro.

C++ 0x está agregando más soporte incorporado para los "viejos" métodos de programación de simultaneidad. Varios proveedores de compiladores están agregando métodos "nuevos" que resumen el modelo de subprocesamiento y permiten decisiones de tiempo de ejecución sobre números de subprocesos, etc. (en función del hardware de la máquina); para Microsoft en particular, vea F #, simultaneidad de tiempo de concurrencia, extensiones paralelas, etc.

Espero que ayude.

5

C++ CSP2 - Fácil de concurrencia para C++

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

CSP es una basada en un paradigma concurrente adecuado en lugar de hilos y cerraduras y todo otro tipo de cosas que se insertan en el último momento .

(Ver Occam-Pi para un lenguaje de programación concurrente (también basado en CSP))

4

artículos: Hora de estos artículos para saber sobre la concurrencia

  1. Free lunch is over
  2. Selected articles by herbsutter
  3. Link to pdf
+0

¿Va a agregar un resumen de los puntos clave de los artículos, o es una [respuesta solo de enlace] (http://meta.stackexchange.com/questions/72000/should-herehere-a- policy-about-one-link-only-answers)? (Uno de los enlaces ya está muerto, por cierto.) – jogojapan

1

Esto es el mejor artículo para comprender la programación concurrente: Concurrent Programming

Obtendrá una imagen completa de la programación concurrente y C++ después de leerla.

Como resumen rápido, podemos decir que la programación concurrente es hacer multitareas. Cuando un programa se bloquea, puede hacer otras cosas. Por lo general, nos bloquean mientras esperamos las conexiones de red y manejamos las E/S. Podemos facilitar la programación concurrente usando fork() y las bibliotecas de hilos.

+0

El enlace que publicó arroja un 404. – xyres