Programación concurrente (V)

 Artículos de la serie:


Mecanismo de exclusión mutua (mutex)


Consideremos un recurso mutable compartido por dos hilos de ejecución diferentes (por supuesto, su número pudiera ser mayor). Si ambos hilos sólo realizan acciones de lectura sobre el recurso, no corremos riesgo alguno de corromperlo. Sin embargo, si al menos uno de los hilos ejecuta acciones de escritura, modificando el recurso, es obvio que deberemos establecer un orden de acceso entre los hilos, de forma que mientras que uno de ellos esté operando con el recurso, el resto de hilos que intenten acceder a él queden momentáneamente bloqueados. Hablamos aquí, pues, de un mecanismo de exclusión mutua entre hilos.

Programación concurrente (IV)

 Artículos de la serie:


¿Cómo funciona std::packaged_task?


En este artículo centraremos nuestra atención en el modo en que se encuentra implementada la plantilla de clase std::packaged_task<> [1], la cual, como analizamos en el post anterior de la serie, constituye un envoltorio para cualquier objeto invocable (funciones, expresiones lambda, etcétera) que deseemos ejecutar asíncronamente. La función miembro pública get_future() de std::packaged_task<> proporciona un objeto std::future<> como método de acceso al estado compartido almacenado en su interior.

Programación concurrente (III)

 Artículos de la serie:


Comprendiendo std::async en más detalle


En post anteriores empezamos a acostumbrarnos al uso de objetos std::future<> en el marco de la programación concurrente. Éstos proporcionan un mecanismo de acceso a los resultados producidos por operaciones asíncronas. Su función miembro pública get(), en particular, aguarda a que el objeto std::future contenga un resultado válido (valor o excepción) para retornarlo al agente invocador.

Ignoremos por el momento la existencia de la función estándar std::async con política de lanzamiento std::launch::async --muy ligada al uso de std::future y de enorme facilidad de uso-- y planteémonos la tarea (nada trivial) de replicar su comportamiento, es decir: ejecutar una operación de forma asíncrona en un nuevo hilo independiente y remitir el valor o excepción producida durante su ejecución al hilo padre. El objetivo no es otro, por supuesto, que el de aprender más acerca de la propia implementación de std::async.