8
votes

Conversion du mot clé de verrouillage de C # à C ++

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);
  }
}


3 commentaires

Juste pour des coups de pied, géré C ++ a verrouillé , Visual Basic a Synclock , mais en réalité, le compilateur convertit à moniteur.enter (...) < / code> et moniteur.exit appels.


Cibler quelle version .NET? La signification de Verrouillage Modifications en fonction de laquelle les surcharges 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é.


9 Réponses :


1
votes

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


1 commentaires

Oh mon. C'est juste affreux. Outre le fait que si (! (Autolock _l = x)) est syntaxiquement incorrect, si vous allez écrire du code en C ++, vous devez écrire idiomatic c ++.



1
votes

C ++ n'a pas de mot clé de verrouillage. Vous pouvez Utilisez un mutex .


0 commentaires

1
votes

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).


0 commentaires

3
votes

Vous pouvez utiliser boost :: mutex et boost :: scoped_lock pour ceci: xxx

Vous pouvez utiliser des macros et boucles pour vous donner un mot-clé verrouillé , bien que je conseille fortement de le faire, car cela va briser le code qui utilise verrouillage comme identifiant. < / p>


1 commentaires

La plupart des cadres C ++ ont quelque chose d'équivalent - qmutexklocker dans qt, csinglelock / cmultilock dans le MFC, etc.



3
votes

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);
  }


1 commentaires


5
votes

a. - Réponse rapide

supposant que vous avez un mutex code> et un objet verroue code> (Votre kilométrage peut varier): p> xxx pré>

Qui peut être utilisé comme: p> xxx pré>

b. - Réponse détaillée h1>

Cela dépend de la bibliothèque que vous utiliserez. P>

B.1 - Pré-requis h3>

Supposons que vous avez: p >

  • A mutex code> objet, qui possède un verrouillage () code> et un déverrouiller () code> méthodes li>
  • A 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>

    Donc, vous avez quelque chose comme: P>

    void foo()
    {
       // not locked
    
       LOCK(mutex)
       {
          // locked !
       }
    
       // not locked
    }
    


0 commentaires

2
votes

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 xxx

in c ++ 11, vous pouvez utiliser un mutex comme synchronisation et serrure_guard de manière similaire pour verrouiller xxx

si vous xxx

alors il aurait vraiment l'air identique :)


0 commentaires