C++ cli 可以为.Net Monitor::Enter/Exit(在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 } };

C++ cli 可以为.Net Monitor::Enter/Exit(在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 } };,c++-cli,raii,C++ Cli,Raii,用法: //begining of some method in MyRefClass RAIIMonitor<MyRefClass> monitor(this); //MyRefClass中某些方法的开头 RAIIMonitor监视器(本); 那么,这是正确的方法吗?如果没有,有没有办法做到这一点?如果是,有没有办法做得更好?Microsoft提供了一个类来做到这一点。#包括,并查看一下lock类。将其与堆栈语义相结合,就得到了RAII锁定 对于简单用例,只需将lo

用法:

 //begining of some method in MyRefClass
 RAIIMonitor<MyRefClass> monitor(this);    
//MyRefClass中某些方法的开头
RAIIMonitor监视器(本);

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

Microsoft提供了一个类来做到这一点。
#包括
,并查看一下lock类。将其与堆栈语义相结合,就得到了RAII锁定

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

void Foo::Bar()
{
    msclr::lock lock(syncObj);
    // Use the protected resource
}
lock类还提供了
Acquire
TryAcquire
Release
方法。有一个构造函数可用于不立即执行锁,而用于稍后锁定,您可以自己调用Acquire或TryAcquire


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

谢谢你,女士:)顺便问一下,你的回答是否意味着我的类实际上正确地完成了任务。我的意思是它缺少很多东西,但我说的是正确地执行它的功能。我认为您需要在终结器中使用“if”语句,以便正确处理的对象不会触发断言。(我认为垃圾收集器仍然处理通过堆栈语义分配的对象。)如果尝试
raimonitor
或其他值类型,可能会出现奇怪的行为。除此之外,看起来还算合理。@David check#8啊,没错。我忘记了C++/CLI编译器在调用
GC::SuppressFinalize时添加了一个(this)GC仍然会清理使用堆栈语义分配的对象,但它不会运行终结器。