Concurrencia Flashcards
¿Qué es la concurrencia?
La concurrencia se produce cuando dos o más tareas (hilos) empiezan, se ejecutan y se completan, superponiéndose entre ellas (NO se ejecutan simultáneamente).
¿Qué es el paralelismo?
El paralelismo se produce cuando dos o más tareas (hilos) se ejecutan de forma SIMULTÁNEA (en un procesador multicore).
¿Qué es un hilo?
Secuencia de instrucciones que se ejecutan en el contexto de un proceso.
Mejoras del modelo de concurrencia de C++ 11.
- Nuevo modelo de memoria.
- Variables thread_local.
- Tipos atómicos.
- Abstracciones portables para la concurrencia: thread, mutex, lock, packaged_task, future.
Representación de un hilo en C++.
- Clase std::thread.
- Ejecutar una función en el hilo: thread t1{f1};
- Esperar a que el hilo termine: t1.join();
¿Qué es una CARRERA DE DATOS?
Se producen cuando dos o más accesos son concurrentes y al menos uno de ellos implica escritura (el orden de ejecución no está definido). Comportamiento no definido del programa.
Paso de argumentos (hilos)
- Función: void f1(int x);
thread t1{f1, 10};
¿Qué es un mutex?
Un mutex permite controlar el acceso con exclusión mutua a un recurso (gestiona el acceso a una región del código).
Uso de lock() y unlock().
- lock() adquiere el mutex y unlock() lo libera.
- Permite que solo el primer hilo que llegue adquiera el mutex, los demás tienen que esperar a que este termine.
- Ejemplo:
mutex m;
m.lock();
//código que queremos proteger
m.unlock(); - lock() puede adquirir varios mutex a la vez:
lock(m1, m2, m3);
Problemas lock() y unlock()
- Olvidar liberar cerrojo (usar unlock(), el programa se queda bloqueado).
- Que se produzcan excepciones.
Uso de unique_lock.
- Libera el cerrojo al salir de la sección de código en la que se encuentre.
- Ejemplo: void f() {
unique_lockl{m};
//código que protege
} //libera el cerrojo al salir
de la función f().
Mecanismos de espera (namespace std::chrono)
- Acceso al reloj:
auto t1 = high_resolution_clock::now(); - Diferencia de tiempos:
auto dif = duration_cast(t2-t1); - Especificación de una espera:
this_thread::sleep_for(microseconds{500});
this_thread::sleep_until(t+milliseconds{10});
¿Qué son las variables condición? Indica los distintos tipos y su uso.
Las variables condición son un tipo primitivo de C++ que se usa junto a un mutex para orquestar la comunicación entre hilos.
- Notificación:
notify_one, notify_all - Espera:
wait, wait_for, wait_until
- Uso: mutex m; std::condition_variable cv; std::unique_lockl{m}; cv.notify_all(); cv.wait(l);
¿Qué son futures y promises en C++?
- std::promise actúa como productor de la operación asíncrona y std::future como consumidor. De esta forma se separa la funcionalidad de escritura del consumidor.
- Permiten traspasar valores entre hilos (no hace falta usar mutex): la promesa asigna un valor (p.set_value()) y el futuro lo recupera (f.get()).
- Con std::async se pueden lanzar tareas asíncronas.
Propiedades de los hilos (clase thread).
- Correspondencia uno a uno con los hilos del sistema operativo.
- Todos los hilos de una aplicación se ejecutan en el mismo espacio de direcciones.
- Hilos de una misma aplicación acceden a las mismas variables globales.
- No se pueden copiar, pero si mover.
- Paso de parámetros a un hilo es por valor.