21

托管 C++ 是否与 C# 的lock()和 VB 的 SyncLock 等效?如果是这样,我该如何使用它?

4

4 回答 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 回答