被迫:(在C ++ CLI中工作我正在寻找一种做RAII锁定的方法。 我想出的是:
ref class RAIIMonitor
{
RAIIMonitor();
T^ t;
public:
RAIIMonitor(T^ t_)
{
t=t_;
System::Threading::Monitor::Enter(t_);
}
~RAIIMonitor()
{
System::Threading::Monitor::Exit(t);
}
!RAIIMonitor()
{
assert(0); // you are using me wrong
}
};
用法:
//begining of some method in MyRefClass
RAIIMonitor<MyRefClass> monitor(this);
这是正确的方法吗,如果没有办法做到这一点,如果有的话有办法做得更好吗?
答案 0 :(得分:4)
Microsoft提供了一个类来执行此操作。 #include <msclr/lock.h>
,看看锁类。将它与堆栈语义相结合,就可以获得RAII锁定。
对于简单的用例,只需将lock对象声明为局部变量,并传入对象以锁定。当通过堆栈语义调用析构函数时,它会释放锁。
void Foo::Bar()
{
msclr::lock lock(syncObj);
// Use the protected resource
}
锁定类还提供Acquire
,TryAcquire
和Release
方法。有一个构造函数可以用来不立即执行锁定,而不是稍后锁定,你自己调用Acquire或TryAcquire。
(如果你看一下实现,你会发现它是你用RAIIMonitor类开始的完整实现。)