托管C++中的C#的lock()

Bri*_*ian 21 multithreading synchronization managed-c++

托管C++是否具有与C#的lock()和VB的SyncLock相同的功能?如果是这样,我该如何使用它?

Ser*_*ger 64

C++/CLI确实有一个'lock'类 - 您需要做的就是使用基于堆栈的语义声明锁变量,并且在调用析构函数时它将安全地退出监视器,例如:

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

    // Do work

} //destructor of lock is called (exits monitor).  
Run Code Online (Sandbox Code Playgroud)

'm_lock'声明取决于您要保护的成员.要保护实例成员,请使用:

Object^ m_lock = gcnew Object(); // Each class instance has a private lock - 
                                 // protects instance members.
Run Code Online (Sandbox Code Playgroud)

要保护静态成员,请使用:

static Object^ m_lock = gcnew Object(); // Type has a private lock -
                                        // protects static members.
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 22

锁/ SyncLock的等价物是使用Monitor类.

在.NET 1-3.5sp中,lock(obj)执行:

Monitor.Enter(obj);
try
{
    // Do work
}
finally
{
    Monitor.Exit(obj);
}
Run Code Online (Sandbox Code Playgroud)

从.NET 4开始,它将是:

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

您可以通过执行以下操作将其转换为C++:

System::Object^ obj = gcnew System::Object();
Monitor::Enter(obj);
try
{
    // Do work
}
finally
{
    Monitor::Exit(obj);
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为http://stackoverflow.com/questions/1369459/cs-lock-in-managed-c/7527111#7527111优越,因为它更多地是C++性质(RAII)以及更接近C#锁关键词 (8认同)