2009-09-02 79 views

回答

20

等同于锁/ SyncLock将使用​​类。

在.NET 1-3.5sp,锁(OBJ)的作用:

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

随着.NET 4中,这将是:

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

你可以做翻译这对C++ :

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

我会考虑http://stackoverflow.com/questions/1369459/cs-lock-in-managed -c/7527111#7527111优越在于它在C++性质(RAII)以及更接近于C#锁关键字 – sehe 2011-09-26 08:56:55

-2

尝试Threading.Monitor。赶上。

+0

和catch?听起来误导了。 – sehe 2011-09-26 08:55:51

2

在C++中没有等效的lock关键字。你可以这样做,而不是:

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

C++/CLI确实有一个“锁”类 - 所有你需要做的是使用基于堆栈的语义声明锁变量,它会安全地离开显示器时,它的析构函数被调用,例如:

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

    // Do work 

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

“m_lock”声明取决于您想保护哪些成员。为了保护实例成员使用:

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

为了保护静态成员的使用:

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

删除'有工作'的'危险的东西',不要破坏人。感谢您的意见。 – Sereger 2011-09-26 13:40:42

+0

+1 - 耻辱我不能+2真的 – sehe 2011-09-26 13:45:01

+0

我不熟悉C++,你如何声明'x'?谢谢 – Baptiste 2013-06-28 12:21:33