std::mutex:: try_lock
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
|
mutex::try_lock
|
||||
| Native handle | ||||
|
bool
try_lock
(
)
;
|
(desde C++11) | |
Intenta bloquear el mutex. Retorna inmediatamente. Si la adquisición del bloqueo es exitosa retorna true , de lo contrario retorna false .
Esta función puede fallar esporádicamente y devolver false incluso si el mutex no está actualmente bloqueado por ningún otro hilo.
Si
try_lock
es llamado por un hilo que ya posee el
mutex
, el comportamiento es indefinido.
La operación previa unlock() en el mismo mutex sincroniza-con (como se define en std::memory_order ) esta operación si retorna true . Nótese que la operación previa lock() no se sincroniza con esta operación si retorna false .
Contenidos |
Parámetros
(ninguno)
Valor de retorno
true si el bloqueo se adquirió exitosamente, de lo contrario false .
Excepciones
No lanza nada.
Ejemplo
#include <chrono> #include <iostream> // std::cout #include <mutex> #include <thread> std::chrono::milliseconds interval(100); std::mutex mutex; int job_shared = 0; // ambos hilos pueden modificar 'job_shared', // mutex protegerá esta variable int job_exclusive = 0; // solo un hilo puede modificar 'job_exclusive' // no se necesita protección // este hilo puede modificar tanto 'job_shared' como 'job_exclusive' void job_1() { std::this_thread::sleep_for(interval); // permitir que 'job_2' tome un bloqueo while (true) { // intentar bloquear mutex para modificar 'job_shared' if (mutex.try_lock()) { std::cout << "job shared (" << job_shared << ")\n"; mutex.unlock(); return; } else { // no se puede obtener el bloqueo para modificar 'job_shared' // pero hay otro trabajo por hacer ++job_exclusive; std::cout << "job exclusive (" << job_exclusive << ")\n"; std::this_thread::sleep_for(interval); } } } // este hilo puede modificar solo '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(); }
Salida posible:
job exclusive (1) job exclusive (2) job exclusive (3) job exclusive (4) job shared (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 C
para
mtx_trylock
|
|