std::mutex::try_lock
De cppreference.com
<tbody>
</tbody>
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.
Parámetros
(Ninguno)
Valor de retorno
true si se adquirió el bloqueo con éxito, de lo contrario false.
Excepciones
No lanza nada.
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)
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
| |