std::recursive_timed_mutex:: try_lock_for
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
|
recursive_timed_mutex::try_lock_for
|
||||
| Native handle | ||||
|
template
<
class
Rep,
class
Period
>
bool try_lock_for ( const std:: chrono :: duration < Rep, Period > & timeout_duration ) ; |
(desde C++11) | |
Intenta bloquear el mutex. Se bloquea hasta que transcurra la duración especificada timeout_duration (timeout) o se adquiera el bloqueo (posee el mutex), lo que ocurra primero. Si la adquisición del bloqueo es exitosa retorna true , en caso contrario retorna false .
Si timeout_duration es menor o igual a timeout_duration. zero ( ) , la función se comporta como try_lock() .
Esta función puede bloquearse por más tiempo que timeout_duration debido a demoras de planificación o contención de recursos.
El estándar recomienda que se utilice un std::steady_clock para medir la duración. Si una implementación utiliza un std::system_clock en su lugar, el tiempo de espera también puede ser sensible a los ajustes del reloj.
Al igual que con try_lock() , se permite que esta función falle espuriamente y devuelva false incluso si el mutex no estaba bloqueado por ningún otro hilo en algún momento durante timeout_duration .
La operación unlock() previa sobre el mismo mutex sincroniza-con (como se define en std::memory_order ) esta operación si retorna true .
Un hilo puede llamar a
try_lock_for
en un mutex recursivo repetidamente. Las llamadas exitosas a
try_lock_for
incrementan el contador de propiedad: el mutex solo se liberará después de que el hilo realice un número equivalente de llamadas a
unlock()
.
El número máximo de niveles de propiedad no está especificado. Una llamada a
try_lock_for
devolverá
false
si se excede este número.
Contenidos |
Parámetros
| timeout_duration | - | duración mínima para bloquear |
Valor de retorno
true si el bloqueo se adquirió exitosamente, de lo contrario false .
Excepciones
Cualquier excepción lanzada por timeout_duration (las duraciones proporcionadas por la biblioteca estándar nunca lanzan excepciones).
Ejemplo
#include <chrono> #include <iostream> #include <mutex> #include <sstream> #include <thread> #include <vector> using namespace std::chrono_literals; std::mutex cout_mutex; // controlar acceso a std::cout std::timed_mutex mutex; void job(int id) { std::ostringstream stream; for (int i = 0; i < 3; ++i) { if (mutex.try_lock_for(100ms)) { stream << "success "; std::this_thread::sleep_for(100ms); mutex.unlock(); } else stream << "failed "; std::this_thread::sleep_for(100ms); } 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& th : threads) th.join(); }
Salida posible:
[0] failed failed failed [3] failed failed success [2] failed success failed [1] success failed success
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2093 | C++11 |
try_lock_for
no lanzaba nada
|
lanza excepciones relacionadas con timeout |
Véase también
|
bloquea el mutex, se bloquea si el mutex no está disponible
(función miembro pública) |
|
|
intenta bloquear el mutex, retorna si el mutex no está disponible
(función miembro pública) |
|
|
intenta bloquear el mutex, retorna si el mutex ha estado
no disponible hasta que se alcanza el punto de tiempo especificado (función miembro pública) |
|
|
desbloquea el mutex
(función miembro pública) |