std::mutex::try_lock
De cppreference.com
bool try_lock(); |
(desde C++11) | |
Intenta bloquear el mutex. Regresa inmediatamente. Si se tiene éxito en adquirir el bloqueo, devuelve true, de lo contrario devuelve false.
Se permite que esta función falle falsamente (spuriously) y devuelva false incluso si el mutex no se encuentra actualmente bloqueado por ningún otro hilo.
Si try_lock
se llama por un hilo que ya posee el mutex
, el comportamiento no está definido.
Una llamada previa a unlock() en el mismo mutex se sincroniza-con (como se define en std::memory_order) esta operación si devuelve true. Observa que una llamada previa a lock() no se sincroniza con esta operación si devuelve false.
Contenido |
[editar] Parámetros
(Ninguno)
[editar] Valor de retorno
true si se adquirió el bloqueo con éxito, de lo contrario false.
[editar] Excepciones
No lanza nada.
[editar] Ejemplo
Ejecuta este código
#include <chrono> #include <mutex> #include <thread> #include <iostream> // std::cout std::chrono::milliseconds interval(100); std::mutex mutex; int job_shared = 0; // ambos hilos pueden modificar a 'job_shared', // el mutex protegerá esta variable int job_exclusive = 0; // solo un hilo puede modificar a 'job_exclusive' // no se necesita protección // este hilo puede modificar tanto a 'job_shared' como a 'job_exclusive' void job_1() { std::this_thread::sleep_for(interval); // dejemos que 'job_2' tome un cerrojo while (true) { // tratar de bloquear el mutex para modificar a 'job_shared' if (mutex.try_lock()) { std::cout << "trabajo compartido (" << job_shared << ")\n"; mutex.unlock(); return; } else { // no se puede obtener el cerrojo para modificar a 'job_shared' // pero hay más trabajo por hacer ++job_exclusive; std::cout << "trabajo exclusivo (" << job_exclusive << ")\n"; std::this_thread::sleep_for(interval); } } } // este hilo solo puede modificar a 'job_shared' void job_2() { mutex.lock(); std::this_thread::sleep_for(5 * interval); ++job_shared; mutex.unlock(); } int main() { std::thread thread_1(job_1); std::thread thread_2(job_2); thread_1.join(); thread_2.join(); }
Posible salida:
trabajo exclusivo (1) trabajo exclusivo (2) trabajo exclusivo (3) trabajo exclusivo (4) trabajo compartido (1)
[editar] Véase también
Bloquea el mutex; se bloquea si el mutex no está disponible (función miembro pública) | |
Desbloquea el mutex (función miembro pública) | |
Documentación de C para mtx_trylock
|