2009-09-02 6 views

Répondre

20

Le equivelent à un verrouillage/SyncLock serait d'utiliser la classe Monitor.

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

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

À partir de .NET 4, il sera:

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

Vous pouvez traduire en C++ en faisant :

System::Object^ obj = gcnew System::Object(); 
Monitor::Enter(obj); 
try 
{ 
    // Do work 
} 
finally 
{ 
    Monitor::Exit(obj); 
} 
+7

Je considère http://stackoverflow.com/questions/1369459/cs-lock-in-managed -c/7527111 # 7527111 supérieur en ce qu'il est à la fois plus dans la nature C++ (RAII) et plus proche du mot clé de verrouillage C# – sehe

-2

Essayez Threading.Monitor. Et attrape.

+0

Et attraper? Sons égarés. – sehe

2

Il n'y a pas d'équivalent du mot-clé lock en C++. Vous pouvez le faire à la place:

Monitor::Enter(instanceToLock); 
try 
{ 
    // Only one thread could execute this code at a time 
} 
finally 
{ 
    Monitor::Exit(instanceToLock); 
} 
55

C++/CLI a une classe de « lock » - tout ce que vous devez faire est de déclarer la variable de verrouillage en utilisant la sémantique basée sur la pile et il sera en toute sécurité quitter le moniteur lorsque son destructor 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 souhaitez protéger. Pour protéger les membres d'instance utilisent ceci:

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

Pour protéger les membres statiques utilisent ceci:

static Object^ m_lock = gcnew Object(); // Type has a private lock - 
             // protect static members. 
+0

Suppression de «choses dangereuses» avec «faire le travail» pour ne pas distraire les gens. Merci pour vos commentaires. – Sereger

+0

+1 - honte Je ne peux pas +2 vraiment – sehe

+0

Je ne suis pas familier avec C++, comment déclarez-vous 'x'? Merci – Baptiste

Questions connexes