Así que vi este video en Youtube con todos estos maestros de C ++ en GoingNative 2012: panel interactivo donde todos podían hacer las preguntas.
Este es el video del que hablaba: GoingNative 2012 - Día 1 - Panel interactivo: La importancia de ser nativo
Y a la hora 0:24:00 alguien hizo una pregunta muy interesante:
Hemos estado haciendo programación concurrente durante algún tiempo usando pthreads, usando hilos de Windows, y así sucesivamente, y estoy muy feliz de que C ++ y C se hayan puesto al día con la programación concurrente, pero me parece que ya lleva cinco años o diez años porque en este momento tenemos todos estos multinúcleos potentes y la programación de estos multinúcleos realmente no debería basarse en subprocesos, sino en tareas [...] y Microsoft tiene la biblioteca PPL y así sucesivamente, y esto es totalmente no se refleja en el estándar C ++. [...] Lo único que me temo es que el estándar podría estar bloqueado en subprocesos y hacer que sea muy difícil pasar a la Programación basada en tareas ...
Ahora soy bastante nuevo en estos conceptos y estoy un poco confundido. Lo que en realidad es programación basada en tareas . ¿Este término se refiere a lo mismo que se refiere a la Programación sin bloqueo ? ¿Son estos dos términos equivalentes o hay algún vínculo entre ellos?
fuente
Does this term refer to the same thing that Lock-Free Programming refers to? Are these two equivalent terms or are there any links between them?
¿Alguien puede explicar? ¿Todas estas bibliotecas basadas en tareas están construidas también sobre hilos o hay alguna otra forma en que se implementaron? ¡Gracias!Respuestas:
Microsoft tiene la "Biblioteca paralela de tareas" o TPL.
Es una abstracción de nivel superior sobre subprocesos y está basada en la biblioteca, por lo que no veo ninguna razón por la que no se pueda construir algo similar en C ++, ya que el TPL ya está basado en subprocesos y no depende de características especiales en el estándar de lenguaje para su implementación (aunque las palabras clave
async
yawait
se agregaron al compilador de C # para facilitar dicha programación).Una tarea en la ecosistema de Microsoft es más o menos equivalente a un futuro o una promesa . Básicamente, es una función sin bloqueo (asíncrona); lo llama, le devuelve el control mientras se ejecuta en un nuevo hilo, y luego recupera el valor de retorno en algún momento posterior cuando esté disponible.
El TPL tiene otras funciones como
Parallel.For
, que le permite procesar un bucle al mismo tiempo, utilizando múltiples hilos. Todas estas cosas podrían implementarse en C ++ como funciones de biblioteca. De hecho, dicha biblioteca ya ha sido escrita .Hasta donde yo sé, la PPL (Biblioteca de patrones paralelos para Microsoft C ++) no depende de ninguna característica especial del lenguaje.
fuente
Task
aThread
es que una tarea no representa necesariamente una función que se ejecuta en otro hilo. Representa cualquier cosa que pueda terminar o generar un valor, mientras no se ejecuta en el hilo actual. Puede ser el resultado de que no se ejecute ningún subproceso si no representa el trabajo vinculado a la CPU. Probablemente el ejemplo más común es IO asíncrono. No representa cuándo una función termina en otro hilo; representa cuando se activa un gancho de sistema operativo particular.Task
no le importa cómo se completa y lo trata como "cualquier operación asincrónica".TaskCompletionSource
. La idea es que cree una tarea y luego continúe ejecutándose, y ese hilo eventualmente hace algo que termina configurando el resultado del TCS, completando así la tarea sin requerir más de un hilo para ejecutar.Ha habido bibliotecas de subprocesos a través de bloques durante siglos en cpp. Hay bloques de creación de subprocesos de Intel que son bastante buenos, y luego hay cosas similares como OpenMP que le permite abstraer el subproceso de una manera 'deje que el sistema lo haga por usted' (esto es compatible con VC ++, debe configurar el / bandera de openmp en tus compilaciones)
Microsoft también está trabajando en Casablanca , que podría no ser una biblioteca de tareas verdaderamente genérica, pero es un marco para escribir sistemas basados en tareas (principalmente para fines de aplicaciones web) que usan algo similar al modelo de actor de Erlang
fuente