Does managed C++ have an equivalent to C#'s lock() and VB's SyncLock? If so, how do I use it?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
The equivelent to a lock / SyncLock would be to use the Monitor class.
In .NET 1-3.5sp, lock(obj) does:
Monitor.Enter(obj);
try
{
// Do work
}
finally
{
Monitor.Exit(obj);
}
As of .NET 4, it will be:
bool taken = false;
try
{
Monitor.Enter(obj, ref taken);
// Do work
}
finally
{
if (taken)
{
Monitor.Exit(obj);
}
}
You could translate this to C++ by doing:
System::Object^ obj = gcnew System::Object();
Monitor::Enter(obj);
try
{
// Do work
}
finally
{
Monitor::Exit(obj);
}
回答2:
C++/CLI does have a 'lock' class - all you need to do is declare lock variable using stack-based semantics and it will safely exit the monitor when its destructor is called, e.g.:
#include <msclr\lock.h>
{
msclr::lock l(m_lock);
// Do work
} //destructor of lock is called (exits monitor).
'm_lock' declaration depends on which members you want to protect. To protect instance members use this:
Object^ m_lock = gcnew Object(); // Each class instance has a private lock -
// protect instance members.
To protect static members use this:
static Object^ m_lock = gcnew Object(); // Type has a private lock -
// protect static members.
回答3:
There's no equivalent of the lock
keyword in C++. You could do this instead:
Monitor::Enter(instanceToLock);
try
{
// Only one thread could execute this code at a time
}
finally
{
Monitor::Exit(instanceToLock);
}
回答4:
Try Threading.Monitor. And catch.