托管 C++ 是否与 C# 的lock()和 VB 的 SyncLock 等效?如果是这样,我该如何使用它?
问问题
15775 次
4 回答
67
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 -
// protects instance members.
要保护静态成员,请使用以下命令:
static Object^ m_lock = gcnew Object(); // Type has a private lock -
// protects static members.
于 2011-09-23T09:47:17.487 回答
22
lock / SyncLock 的等价物是使用Monitor类。
在 .NET 1-3.5sp 中,lock(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);
}
于 2009-09-02T18:52:24.427 回答
2
C++ 中没有等效的lock
关键字。你可以这样做:
Monitor::Enter(instanceToLock);
try
{
// Only one thread could execute this code at a time
}
finally
{
Monitor::Exit(instanceToLock);
}
于 2009-09-02T18:54:53.690 回答
-2
试试 Threading.Monitor。并抓住。
于 2009-09-02T18:53:06.203 回答