web-dev-qa-db-fra.com

Utiliser std :: lock_guard avec try_lock

Existe-t-il un moyen de savoir std::lock_gaurd appeler try_lock au lieu de lock lorsqu'il acquiert le mutex?

La seule façon dont je pouvais penser est d'utiliser std::adopt_lock:

if (!_mutex.try_lock())
{
    // Handle failure and return from the function
}
std::lock_guard<my_mutex_class> lock(_mutex, std::adopt_lock);

Existe-t-il une solution intégrée à mon problème plutôt que d'acquérir le verrou explicitement et de donner ensuite lock_guard la responsabilité de le publier?

30
Mr. Anderson

Un design de base invariant de lock_guard Est qu'il détient toujours le verrou. Cela minimise la surcharge car son destructeur peut appeler inconditionnellement unlock(), et il n'a pas à stocker d'état supplémentaire.

Si vous avez besoin du comportement de verrouillage, utilisez unique_lock:

std::unique_lock<std::mutex> lock(_mutex, std::try_to_lock);
if(!lock.owns_lock()){
    // mutex wasn't locked. Handle it.
}
51
T.C.