Sincronización Flashcards
Tipos de mutex.
- mutex: mutex básico.
- recursive_mutex: puede ser adquirido más de una vez por el mismo hilo.
- timed_mutex: mutex no recursivo con operaciones con tiempo límite.
- recursive_timed_mutex: mutex recursivo con operaciones con tiempo límite.
Operaciones mutex.
- Construcción por defecto.
- No se puede ni copiar ni mover.
- Destructor solo válido si el mutex ha sido liberado.
- Adquisición y liberación con lock, unlock y trylock (intenta adquirir mutex y si lo consigue informa con un mensaje de éxito).
¿Para qué son útiles los recursive_mutex?
Son útiles para usarlos con funciones recursivas, con un mutex básico se quedan en deadlock.
¿Qué son los mutex con tiempo límite (timed mutex)?
Son timed_mutex y recursive_timed_mutex: añaden operaciones de adquisición con especificación de tiempo límite.
- try_lock_for() y try_lock_until().
¿Ventajas de usar lock_guard?
lock_guardl{m} es una guarda que adquiere un mutex. Garantiza que el mutex está debidamente bloqueado aunque haya excepciones.
Construcción de unique_lock.
- adquiere mutex: unique_lockl{m};
- cerrojo asociado al mutex, pero no lo adquiere:
unique_lockl{m, defer_lock}; - construye cerrojo e intenta adquirirlo:
unique_lockl{m, try_lock}; - Asume que el mutex ya está adquirido por el hilo:
unique_lockl{m}, adopt_lock};
Operaciones de movimiento e intercambio de unique_lock.
- unique_lockl{l2};
- equivalente a l = move(l2);
- l1.swap(l2);
- swap(l1,l2);
¿Qué es un deadlock?
Un deadlock se produce cuando varios componentes adquieren el mismo conjunto de cerrojos, dependiendo del orden pueden interbloquearse.
¿Qué es un cerrojo compartido?
Añadido en C++14, permite que haya múltiples lectores y un solo escritor.
El escritor usa: lock_guardl(m);
El lector: shared_lock_guardl(m);