C#'s lock() en C++Managé

4 réponses

l'équivalent d'un lock / SyncLock serait d'utiliser le Monitor classe.

.NET 1-3.5 sp, de verrouillage(obj):

Monitor.Enter(obj);
try
{
    // Do work
}
finally
{
    Monitor.Exit(obj);
}

à partir de .NET 4, ce sera:

bool taken = false;
try
{
    Monitor.Enter(obj, ref taken);
    // Do work
}
finally
{
    if (taken)
    {
        Monitor.Exit(obj);
    }
}

vous pouvez traduire ceci en C++ en faisant:

System::Object^ obj = gcnew System::Object();
Monitor::Enter(obj);
try
{
    // Do work
}
finally
{
    Monitor::Exit(obj);
}
20
répondu Reed Copsey 2009-09-02 18:52:24

C++ / CLI a une classe' lock ' - tout ce que vous devez faire est de déclarer la variable lock en utilisant la sémantique basée sur la pile et il sortira en toute sécurité du moniteur quand son destructeur est appelé, par exemple:

#include <msclr\lock.h>
{    
    msclr::lock l(m_lock);

    // Do work

} //destructor of lock is called (exits monitor).  

la déclaration "m_lock" dépend des membres que vous voulez protéger. Pour protéger les membres de l'instance, utilisez ceci:

Object^ m_lock = gcnew Object(); // Each class instance has a private lock - 
                                 // protect instance members.

Pour protéger les membres statiques utiliser ceci:

static Object^ m_lock = gcnew Object(); // Type has a private lock -
                                        // protect static members.
56
répondu Sereger 2013-06-29 18:10:32

il n'y a pas d'équivalent de lock mot clé en C++. Vous pouvez faire ceci à la place:

Monitor::Enter(instanceToLock);
try
{
    // Only one thread could execute this code at a time
}
finally
{
    Monitor::Exit(instanceToLock);
}
2
répondu Darin Dimitrov 2009-09-02 18:54:53

Essayez Le Filetage.Surveiller. Et catch.

-2
répondu ima 2009-09-02 18:53:06