Pregunta

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

¿Fue útil?

Solución

La concurrencia consiste en que su código haga varias cosas al mismo tiempo.Esto normalmente se hace con "hilos" explícitos, pero existen otras posibilidades.Por ejemplo, si usa directivas OpenMP en su código, un compilador que admita OpenMP generará subprocesos automáticamente.

Thread es la abreviatura de "hilo de ejecución".En un programa C++ de un solo subproceso, 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 principal, pero la aplicación puede iniciar subprocesos adicionales que comienzan en una función especificada por el usuario.Luego, estos se ejecutan al mismo tiempo o en paralelo con el hilo original.

En C++ 0x, los subprocesos se inician utilizando el std::thread clase:

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 admite:

  • valores atómicos y operaciones con el std::atomic<> plantilla de clase,
  • mutex para protección de datos (std::mutex, std::recursive_mutex, etc.)
  • clases de bloqueo para facilitar la gestión de la vida útil del 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 riesgo de bloqueo.
  • variables de condición para facilitar la espera de un evento (std::condition_variable, std::condition_variable_any)
  • futuros, promesas y tareas empaquetadas para simplificar el paso de datos entre subprocesos y la espera de que un valor esté listo.Esto aborda la clásica pregunta "¿cómo devuelvo un valor de un hilo?".
  • Inicialización segura para subprocesos de objetos estáticos locales.
  • el thread_local palabra clave para declarar datos locales de subprocesos

Ofrecí una descripción más detallada de la nueva biblioteca de subprocesos C++ 0x en mi artículo en devx.com: Subprocesos múltiples más simples en C++ 0x

Escribo sobre subprocesos múltiples y concurrencia en C++ en mi blog.También estoy escribiendo un libro sobre el tema: Simultaneidad de C++ en acción.

Otros consejos

Cuando dices " cómo los nuevos estándares de C ++ facilitan " programación simultánea, supongo que está hablando del pronto (?) que se lanzará el estándar C ++ 09.

El nuevo estándar tal como está actualmente en forma de borrador admite los siguientes elementos que ayudan con la programación concurrente:

  • tipos atómicos y direcciones
  • una clase de hilo
  • almacenamiento thread_local (que se acaba de agregar al borrador del estándar hace unos meses)
  • exclusión mutua (clases mutex)
  • variables de condición: esto es particularmente bueno para Windows, ya que las variables de condición son difíciles de implementar correctamente en Win32. Esto significa que eventualmente Microsoft debería proporcionar soporte para 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 variables de condición correcta en WIn32.

La 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 dada a un nuevo hilo de ejecución. El estándar de Unix es la biblioteca pthreads.

C ++ CSP2 - Simultánea concurrencia para C ++

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

CSP se basa en un paradigma concurrente adecuado en lugar de hilos y bloqueos y todo otro tipo de cosas que se agregan como una ocurrencia tardía.

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

Mi opinión ligeramente diferente, específica de las direcciones futuras de los paradigmas de programación:

La concurrencia consiste en escribir su programa de manera que pueda hacer varias cosas a la vez si el hardware lo admite.Actualmente, la mayoría de los lenguajes tienen mecanismos bastante pesados ​​y complicados para permitir al programador especificar esto (por ejemplo:hilos con sincronización manual, directivas de preprocesador OpenMP, etc.).

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

C++ 0x está agregando más soporte integrado para los métodos "antiguos" de programación concurrente.Varios proveedores de compiladores están agregando métodos "nuevos" que abstraen el modelo de subprocesos y permiten decisiones en tiempo de ejecución sobre el número de subprocesos, etc.(basado en el hardware de la máquina);para Microsoft en particular, consulte F#, tiempo de ejecución de simultaneidad, extensiones paralelas, etc.

Espero que ayude.

Este es el mejor artículo para comprender la programación concurrente: Programación concurrente

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

Como resumen rápido, podemos decir que la programación concurrente consiste en realizar múltiples tareas.Cuando un programa se bloquea, puede hacer otras cosas.Normalmente nos bloqueamos mientras esperamos conexiones de red y tratamos con E/S.Podemos facilitar la programación concurrente usando fork() y bibliotecas de hilos.

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