2009-09-02 59 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