是否可以为.Net Monitor :: Enter / Exit实现RAII(在C ++ CLI中)

时间:2012-07-03 07:39:26

标签: c++-cli raii

被迫:(在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);    

这是正确的方法吗,如果没有办法做到这一点,如果有的话有办法做得更好吗?

1 个答案:

答案 0 :(得分:4)

Microsoft提供了一个类来执行此操作。 #include <msclr/lock.h>,看看锁类。将它与堆栈语义相结合,就可以获得RAII锁定。

对于简单的用例,只需将lock对象声明为局部变量,并传入对象以锁定。当通过堆栈语义调用析构函数时,它会释放锁。

void Foo::Bar()
{
    msclr::lock lock(syncObj);
    // Use the protected resource
}

锁定类还提供AcquireTryAcquireRelease方法。有一个构造函数可以用来不立即执行锁定,而不是稍后锁定,你自己调用Acquire或TryAcquire。

(如果你看一下实现,你会发现它是你用RAIIMonitor类开始的完整实现。)