std::timed_mutex::try_lock_for
template< class Rep, class Period > bool try_lock_for( const std::chrono::duration<Rep,Period>& timeout_duration ); |
(desde C++11) | |
Intenta bloquear el mutex. Bloquea hasta que haya transcurrido el tiempo de espera timeout_duration
especificado o se adquiera el bloqueo, lo que ocurra primero. En la adquisición exitosa del cerrojo, devuelve true, de lo contrario devuelve false.
Si timeout_duration
es menor o igual que timeout_duration.zero()
, la función se comporta como try_lock().
Esta función puede bloquear por un período más largo que timeout_duration
debido a debido a retrasos en la programación o la contención de recursos.
El estándar recomienda que se utilice un steady_clock para medir la duración. Si en su lugar una implementación usa un system_clock, el tiempo de espera también puede ser sensible a los ajustes del reloj.
Al igual que con try_lock(), esta función puede fallar falsamente (spuriously) y devolver false incluso si el mutex no fue bloqueado por ningún otro hilo en algún momento durante timeout_duration
.
Una operación unlock() previa en el mismo mutex se sincroniza-con (como se define en std::memory_order) esta operación si devuelve true.
Si try_lock_for
se llama por un hilo que ya posee el mutex
, el comportamiento no está definido.
Contenido |
[editar] Parámetros
timeout_duration | - | La duración mínima por la cual bloquearse. |
[editar] Valor de retorno
true Si el bloqueo se adquirió exitosamente, de lo contrario false.
[editar] Excepciones
Cualquier excepción lanzada por el reloj, punto de tiempo o duración usados para medir durante la ejecución (los relojes, puntos de tiempo y duraciones proporcionadas por la biblioteca estándar nunca lanzan).
[editar] Ejemplo
#include <iostream> #include <mutex> #include <thread> #include <vector> #include <sstream> std::mutex cout_mutex; // controlar acceso a std::cout std::timed_mutex mutex; void job(int id) { using Ms = std::chrono::milliseconds; std::ostringstream stream; for (int i = 0; i < 3; ++i) { if (mutex.try_lock_for(Ms(100))) { stream << "exitoso "; std::this_thread::sleep_for(Ms(100)); mutex.unlock(); } else { stream << "fallido "; } std::this_thread::sleep_for(Ms(100)); } std::lock_guard<std::mutex> lock(cout_mutex); std::cout << "[" << id << "] " << stream.str() << "\n"; } int main() { std::vector<std::thread> threads; for (int i = 0; i < 4; ++i) { threads.emplace_back(job, i); } for (auto& i: threads) { i.join(); } }
Posible salida:
[0] fallido fallido fallido [3] fallido fallido exitoso [2] fallido exitoso fallido [1] exitoso fallido exitoso
[editar] Véase también
Bloquea el mutex; se bloquea si el mutex no está disponible (función miembro pública) | |
Intenta bloquear el mutex; regresa si el mutex no está disponible (función miembro pública) | |
Intenta bloquear el mutex; regresa si el mutex no ha estado disponible hasta que se haya alcanzado el punto de tiempo especificado (función miembro pública) | |
Desbloquea el mutex (función miembro pública) |