Comment puis-je implémenter le mot-clé de verrouillage de C # en C ++? Le code en C # est le suivant:
try
{
lock (matrixLock)
{
ThisTransformation.get_Renamed(matrix);
}
}
9 Réponses :
Voici tout ce dont vous avez besoin: Implémentation d'un mot clé de verrouillage en C ++
C ++ N'a pas de mot clé de verrouillage, mais vous pouvez en faire un vous-même. Compte tenu d'une classe mutex qui a des fonctions de verrouillage () et de déverrouillage () (et peut-être une isolée () pour commodité) la plupart des programmeurs C ++ écriraient immédiatement un autolock, un peu comme suit: P>
#define lock(x) if (!(AutoLock _l = x)); else
Oh mon. C'est juste affreux. Outre le fait que si (! (Autolock _l = x)) code> est syntaxiquement incorrect, si vous allez écrire du code en C ++, vous devez écrire idiomatic c ++.
Vous ne pouvez pas, aucun mot clé de ce type n'existe, la chose la plus proche que vous obtiendrez est de boost verrouillage scopé (qui peut utiliser un mutex boost). P>
Vous pouvez utiliser Vous pouvez utiliser des macros et boucles pour vous donner un mot-clé code> verrouillé code>, bien que je conseille fortement de le faire, car cela va briser le code qui utilise boost :: mutex code> et boost :: scoped_lock code> pour ceci: verrouillage code> comme identifiant. P> < / p>
La plupart des cadres C ++ ont quelque chose d'équivalent - qmutexklocker code> dans qt, csinglelock code> / cmultilock code> dans le MFC, etc.
Le C # LOCK CODE> Mot-clé n'est pas un mutex fort>. Au lieu de cela, il appelle moniteur :: Entrée () code> Essayez ceci. Regardez également Référence MSDN . // Request the lock, and block until it is obtained.
Monitor::Enter(m_inputQueue);
try
{
// Write your code here.
}
finally
{
// Ensure that the lock is released.
Monitor::Exit(m_inputQueue);
}
Voir aussi Article d'Eric Lippert, " Les serrures et les exceptions ne se mélangent pas. "
supposant que vous avez un Qui peut être utilisé comme: p> Cela dépend de la bibliothèque que vous utiliserez. P> Supposons que vous avez: p > Donc, vous avez quelque chose comme: P> mutex code> et un objet verroue code> (Votre kilométrage peut varier): p> b. - Réponse détaillée h1>
B.1 - Pré-requis h3>
mutex code> objet, qui possède un verrouillage () code> et un déverrouiller () code> méthodes li>
Objet CODE> Objet, qui possède un constructeur avec un Mutex code> comme paramètre et appelle son verrouillage () code> méthode de construction et Déverrouiller () Code> Méthode à la destruction LI>
ul> void foo()
{
// not locked
LOCK(mutex)
{
// locked !
}
// not locked
}
Je cherchais la même venant de C # Fond et trébuche sur cette question plusieurs fois .. Je sais que c'est de nombreuses années après sa demande, mais maintenant avec C ++ 11, vous pouvez utiliser STD :: Lock_Guard et la syntaxe est devenu très similaire à c #
où en C #, vous avez p> in c ++ 11, vous pouvez utiliser un mutex comme synchronisation et serrure_guard de manière similaire pour verrouiller p> si vous p> alors il aurait vraiment l'air identique :) p> p> p>
Vous pouvez utiliser Voici l'exemple simplifié de cette documentation: p> std :: Lock_Guard Code> a >
Juste pour des coups de pied, géré C ++ a code> verrouillé code>, Visual Basic a
Synclock code>, mais en réalité, le compilateur convertit àmoniteur.enter (...) < / code> etmoniteur.exit code> appels.Cibler quelle version .NET? La signification de
Verrouillage code> Modifications en fonction de laquelle les surcharges code> code> sont disponibles ...Est-ce que c'est essayer associé à une prise ou à un enfin? Attraper une exception qui sort d'une serrure est une mauvaise odeur de code. Le point de la serrure consiste à maintenir des invariants d'État partagés cohérents et le point de l'exception est que certains invariants étaient violés de manière inattendue. La combinaison des deux semble être une brassage de troubles; Si la prise est activée, le verrou vient d'être donné à quelqu'un d'autre, mais la capture n'a pas encore nettoyé l'état violé.