std::unique_lock::lock - cppreference.com
|
|
(desde C++11) | |
Bloquea el mutex asociado (es decir, toma posesión). Efectivamente llama a mutex()->lock().
Parámetros
(Ninguno)
Valor de retorno
(Ninguno)
Excepciones
- Cualquier excepción lanzada por
mutex()->lock().
- Si no hay un mutex asociado, std::system_error con un código de error de std::errc::operation_not_permitted.
- Si el mutex ya está bloqueado por este objeto
unique_lock(en otras palabras, owns_lock estrue), std::system_error con un código de error de std::errc::resource_deadlock_would_occur.
Ejemplo
El siguiente ejemplo utiliza a lock para readquirir un mutex que estaba desbloqueado.
#include <mutex> #include <thread> #include <iostream> #include <vector> #include <chrono> int main() { int contador = 0; std::mutex mutex_del_contador; std::vector<std::thread> hilos; auto tarea_obrera = [&](int id) { std::unique_lock<std::mutex> cerrojo(mutex_del_contador); ++contador; std::cout << id << ", contador inicial: " << contador << '\n'; cerrojo.unlock(); // no mantener el bloqueo mientras simulamos una operación cara std::this_thread::sleep_for(std::chrono::seconds(1)); cerrojo.lock(); ++contador; std::cout << id << ", contador final: " << contador << '\n'; }; for (int i = 0; i < 10; ++i) hilos.emplace_back(tarea_obrera, i); for (auto &hilo : hilos) hilo.join(); }
Posible salida:
0, contador inicial: 1 1, contador inicial: 2 2, contador inicial: 3 3, contador inicial: 4 4, contador inicial: 5 5, contador inicial: 6 6, contador inicial: 7 7, contador inicial: 8 8, contador inicial: 9 9, contador inicial: 10 6, contador final: 11 3, contador final: 12 4, contador final: 13 2, contador final: 14 5, contador final: 15 0, contador final: 16 1, contador final: 17 7, contador final: 18 9, contador final: 19 8, contador final: 20
Véase también
| Intenta bloquear el mutex asociado (es decir, tomar posesión) sin bloquearse. (función miembro pública) [editar] | |
| Desbloquea el mutex asociado; es decir, libera su posesión. (función miembro pública) [editar] |