Verrouillage de multiples mutex
Je me demandais si il est possible de verrouiller plusieurs mutex dans le même temps, comme:
Mutex1.Lock();
{
Mutex2.Lock();
{
//Code locked by mutex 1 and 2.
}
Mutex2.Unlock();
//Code locked by mutex 1.
}
Mutex1.Unlock();
Il serait très utile dans certaines situations. Merci.
Oui, c'est possible. Il suffit de faire attention, sans la diligence voulue peut facilement conduire à des blocages.
OriginalL'auteur grimgrom | 2012-11-20
Vous devez vous connecter pour publier un commentaire.
C'est possible, mais la commande de verrouillage doit être cohérente tout au long de l'application sinon blocage est une conséquence probable (si deux threads acquérir les verrous dans l'ordre inverse ensuite, chaque thread pourrait être en attente sur l'autre la libération de l'un des verrous).
Vous recommandons d'utiliser une étendue de verrouillage et déverrouillage de l'installation d'une exception de sécurité, afin d'assurer les verrous sont toujours en liberté (
std::lock_guard
avecstd::mutex
par exemple):Si votre compilateur ne supporte pas ces C++11 caractéristiques boost est similaire dans
boost::mutex
etboost::lock_guard
.oui, il est. Le
lock_guard
est mentionné comme l'on fait exception de sécurité beaucoup plus simple à réaliser, mais il n'est pas nécessaire pour éviter les blocages. Pour éviter les blocages de s'assurer que les écluses sont toujours acquis dans le même ordre et toujours libéré, indépendamment de la façon dont le code de verrouillage de l'acquisition des sorties.remarque vous pouvez facilement écrire votre propre
Lock_guard
classe pour votreMutex
classe. JusteLock()
dans le constructeur etUnlock()
dans le destructeur. Juste être sûr queLock_guard
stocke une référence à laMutex
instance et de ne pas le copier.Comment se fait-il y aurait une différence si j'utilise une classe supplémentaire appelée Lock_guard au lieu de simplement en utilisant ma classe Mutex. Je veux dire, je suis juste l'appel de Verrouillage/Déverrouillage dans les deux cas?
Il facilite le traitement des exceptions plus simple, c'est tout.
OriginalL'auteur hmjd
std::lock
semble exister à cet effet.http://en.cppreference.com/w/cpp/thread/lock
OriginalL'auteur Pubby
C++17 fournit également
scoped_lock
dans le but spécifique de verrouillage multiples mutex qui empêche le blocage dans un RAII style, similaire àlock_guard
.OriginalL'auteur Passer By