Espacios de nombres
Variantes
Acciones

std::unique_lock

De cppreference.com
< cpp‎ | thread
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
(C++11)
Gestión genérica de bloqueo
(C++11)
(C++11)
unique_lock
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
(C++11)
Semáforos
Pestillos y barreras
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
(C++11)
(C++11)
Recuperación segura
(C++26)
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
 
Definido en el archivo de encabezado <mutex>
template< class Mutex >
class unique_lock;
(desde C++11)

La clase unique_lock es un envoltorio de propiedad de mutex de propósito general que permite el bloqueo diferido, intentos de bloqueo por tiempo limitado, bloqueo recursivo, transferencia de propiedad de bloqueo y uso con variables de condición.

La clase unique_lock se puede mover, pero no se puede copiar; cumple con los requerimientos de MoveConstructible y MoveAssignable pero no de CopyConstructible o CopyAssignable.

La clase unique_lock cumple con los requerimientos de BasicLockable. Si Mutex cumple con los requerimientos de Lockable, unique_lock también cumple con los requerimientos de Lockable (p. ej., se puede usar en std::lock); si Mutex cumple con los requerimientos de TimedLockable, unique_lock también cumple con los requerimientos de TimedLockable.

Contenido

[editar] Parámetros de plantilla

Mutex - El tipo de mutex a bloquear. El tipo debe cumplir con los requerimientos de BasicLockable.

[editar] Tipos miembro

Tipo Definición
mutex_type Mutex

[editar] Funciones miembro

Construye un objeto unique_lock, y opcionalmente bloquea el mutex suplementado (es decir, toma posesión).
(función miembro pública) [editar]
Desbloquea el mutex asociado, si es que lo posee (es decir, libera su posesión).
(función miembro pública) [editar]
Desbloquea el mutex (es decir, libera la posesión) si es que se posee, y toma posesión de otro.
(función miembro pública) [editar]
Bloqueo
Bloquea el mutex asociado (es decir, toma posesión).
(función miembro pública) [editar]
Intenta bloquear el mutex asociado (es decir, tomar posesión) sin bloquearse.
(función miembro pública) [editar]
Intenta bloquear el mutex TimedLockable asociado; es decir, de tomar posesión. Regresa si el mutex no ha estado disponible por la duración de tiempo especificada.
(función miembro pública) [editar]
Intenta bloquear el mutex TimedLockable asociado; es decir, de tomar posesión. Regresa si el mutex no ha estado disponible hasta que se alcance un punto de tiempo especificado.
(función miembro pública) [editar]
Desbloquea el mutex asociado; es decir, libera su posesión.
(función miembro pública) [editar]
Modificadores
Intercambia el estado con otro std::unique_lock.
(función miembro pública) [editar]
Desasocia el mutex asociado (es decir, libera su posesión) sin bloquearse.
(función miembro pública) [editar]
Observadores
Devuelve un puntero al mutex asociado.
(función miembro pública) [editar]
Comprueba si el cerrojo posee (es decir, ha bloqueado) su mutex asociado.
(función miembro pública) [editar]
Comprueba si el cerrojo posee (es decir, ha bloqueado) su mutex asociado.
(función miembro pública) [editar]

[editar] Funciones no miembro

Especialización de std::swap para unique_lock
(plantilla de función) [editar]

[editar] Ejemplo

#include <mutex>
#include <thread>
#include <chrono>
 
struct Caja {
    explicit Caja(int num) : num_cosas{num} {}
 
    int num_cosas;
    std::mutex m;
};
 
void transferir(Caja &de, Caja &a, int num)
{
    // no hay que tomar los cerrojos todavía
    std::unique_lock<std::mutex> lock1(de.m, std::defer_lock);
    std::unique_lock<std::mutex> lock2(a.m, std::defer_lock);
 
    // bloquear ambos unique_locks sin interbloqueo
    std::lock(lock1, lock2);
 
    de.num_cosas -= num;
    a.num_cosas += num;
 
    // los mutex 'de.m' y 'a.m' se han desbloqueado en los dtores de 'unique_lock'
}
 
int main()
{
    Caja acc1(100);
    Caja acc2(50);
 
    std::thread t1(transferir, std::ref(acc1), std::ref(acc2), 10);
    std::thread t2(transferir, std::ref(acc2), std::ref(acc1), 5);
 
    t1.join();
    t2.join();
}


[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2981 C++17 Se proporcionó una guía de deducción redundante de unique_lock<Mutex>. Se eliminó.

[editar] Véase también

Implementa un envoltorio de propiedad de mutex estrictamente basado en un ámbito.
(plantilla de clase) [editar]
Envoltorio RAII que evita bloqueo mutuo para múltiples mutex.
(plantilla de clase) [editar]