Concurrencia Flashcards

1
Q

¿Qué es la concurrencia?

A

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).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

¿Qué es el paralelismo?

A

El paralelismo se produce cuando dos o más tareas (hilos) se ejecutan de forma SIMULTÁNEA (en un procesador multicore).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

¿Qué es un hilo?

A

Secuencia de instrucciones que se ejecutan en el contexto de un proceso.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Mejoras del modelo de concurrencia de C++ 11.

A
  • Nuevo modelo de memoria.
  • Variables thread_local.
  • Tipos atómicos.
  • Abstracciones portables para la concurrencia: thread, mutex, lock, packaged_task, future.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Representación de un hilo en C++.

A
  • Clase std::thread.
  • Ejecutar una función en el hilo: thread t1{f1};
  • Esperar a que el hilo termine: t1.join();
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

¿Qué es una CARRERA DE DATOS?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Paso de argumentos (hilos)

A
  • Función: void f1(int x);

thread t1{f1, 10};

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

¿Qué es un mutex?

A

Un mutex permite controlar el acceso con exclusión mutua a un recurso (gestiona el acceso a una región del código).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Uso de lock() y unlock().

A
  • 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);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Problemas lock() y unlock()

A
  • Olvidar liberar cerrojo (usar unlock(), el programa se queda bloqueado).
  • Que se produzcan excepciones.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Uso de unique_lock.

A
  • 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().
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Mecanismos de espera (namespace std::chrono)

A
  • 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});
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

¿Qué son las variables condición? Indica los distintos tipos y su uso.

A

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);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

¿Qué son futures y promises en C++?

A
  • 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.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Propiedades de los hilos (clase thread).

A
  • 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.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Problemas con hilos

A

El destructor se invoca al salir del alcance donde se define el hilo, se puede perder el vínculo con un hilo del sistema, de forma que se sigue ejecutando pero no tenemos acceso a él.

17
Q

¿Qué son los hilos no asociados?

A

Se usa detach() para que el hilo se siga ejecutando después de que el destructor se ejecute (útil para demonios). Ojo, se pierde el control sobre el hilo.

18
Q

¿Qué son las variables static y thread_local?

A
  • Una variable static tiene una única copia compartida por todos los hilos.
  • Las variables thread_local tienen una copia por cada hilo.