std::defer_lock_t, std::try_to_lock_t, std::adopt_lock_t
De cppreference.com
Definido en el archivo de encabezado <mutex>
|
||
struct defer_lock_t { explicit defer_lock_t() = default; }; struct try_to_lock_t { explicit try_to_lock_t() = default; }; |
(desde C++11) | |
std::defer_lock_t
, std::try_to_lock_t
y std::adopt_lock_t
son tipos etiqueta de clase vacía usados para especificar la estrategia de bloqueo para std::lock_guard, std::scoped_lock, std::unique_lock, y std::shared_lock.
Tipo | Efecto(s) |
defer_lock_t
|
No toman posesión del mutex |
try_to_lock_t
|
Tratan de tomar posesión del mutex sin bloquear |
adopt_lock_t
|
Supone que el hilo que llama ya tomó posesión del mutex |
[editar] Ejemplo
Ejecuta este código
#include <mutex> #include <thread> struct cuenta_de_banco { explicit cuenta_de_banco(int balance) : balance(balance) {} int balance; std::mutex m; }; void transferir(cuenta_de_banco &de, cuenta_de_banco &a, int cantidad) { // bloquear ambos mutexes sin bloqueo mutuo std::lock(from.m, to.m); // asegurarse que ambos mutexes ya bloqueados se desbloqueen al terminar el ámbito std::lock_guard lock1(de.m, std::adopt_lock); std::lock_guard lock2(a.m, std::adopt_lock); // enfoque equivalente: // std::unique_lock<std::mutex> lock1(de.m, std::defer_lock); // std::unique_lock<std::mutex> lock2(a.m, std::defer_lock); // std::lock(lock1, lock2); de.balance -= cantidad; a.balance += cantidad; } int main() { cuenta_de_banco mi_cuenta(100); cuenta_de_banco tu_cuenta(50); std::thread t1(transferir, mi_cuenta, tu_cuenta, 10); std::thread t2(transferir, tu_cuenta, mi_cuenta, 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 2510 | C++11 | El constructor por defecto no era explicit , lo que podía llevar a ambigüedad.
|
Se hizo explicit .
|
[editar] Véase también
(C++11)(C++11)(C++11) |
Constantes de etiqueta que se utilizan para la estrategia de bloqueo. (constante) |
Construye un objeto lock_guard , opcionalmente bloquea el mutex dado. (función miembro pública de std::lock_guard )
| |
Construye un objeto unique_lock , y opcionalmente bloquea el mutex suplementado (es decir, toma posesión). (función miembro pública de std::unique_lock )
|