【发布时间】:2009-09-02 18:45:31
【问题描述】:
托管 C++ 是否具有与 C# 的 lock() 和 VB 的 SyncLock 等效的功能?如果是这样,我该如何使用它?
【问题讨论】:
标签: multithreading synchronization managed-c++
托管 C++ 是否具有与 C# 的 lock() 和 VB 的 SyncLock 等效的功能?如果是这样,我该如何使用它?
【问题讨论】:
标签: multithreading synchronization managed-c++
C++/CLI 确实有一个lock 类。你需要做的就是使用基于堆栈的语义声明一个锁变量,当它的析构函数被调用时它会安全地退出监视器,例如:
#include <msclr\lock.h>
{
msclr::lock l(m_lock);
// Do work
} //destructor of lock is called (exits monitor).
m_lock 声明取决于您是同步访问实例还是静态成员。
要保护 instance 成员,请使用:
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.
【讨论】:
锁 / 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);
}
【讨论】:
C++ 中没有 lock 关键字的等效项。你可以这样做:
Monitor::Enter(instanceToLock);
try
{
// Only one thread could execute this code at a time
}
finally
{
Monitor::Exit(instanceToLock);
}
【讨论】:
试试 Threading.Monitor。并抓住。
【讨论】: