2012-07-03 2 views
2

강제로 : (C++ CLI에서 작동하려면 RAII 잠금을 수행 할 방법을 찾고 있습니다.) 내가 생각해 낸 것은 :RAII가 .Net Monitor :: Enter/Exit (C++ CLI에서) 용으로 구현 될 수 있습니까?

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);  

그래서 올바른 방법이, 없다

답변

4

마이크로 소프트가 제공 이 작업을 수행 할 클래스입니다. #include <msclr/lock.h>, 잠금 클래스를 살펴보십시오. 이를 스택 의미론과 결합하면 RAII 잠금이 설정됩니다.

간단한 사용 사례의 경우 잠금 개체를 로컬 변수로 선언하고 잠그기 위해 개체를 전달하기 만하면됩니다. 소멸자가 스택 의미론을 통해 호출되면 잠금을 해제합니다.

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

잠금 클래스는 Acquire, TryAcquireRelease 방법을 제공합니다. 잠금을 즉시 수행하지 않고 대신 나중에 잠그는 데 사용할 수있는 생성자가 있으며 Acquire 또는 TryAcquire를 직접 호출합니다.

(당신이 구현 보면, 당신은 당신이 당신의 RAIIMonitor 클래스로의 시작이 있었는지의 전체 구현의 것을 볼 수 있습니다.)

+0

당신에게 MS 감사드립니다. :) BTW 귀하의 대답은 실제로 내 수업이 제대로 일을 의미합니다. 나는 물건이 부족하다는 것을 의미하지만, Im은 올바르게하는 것에 대해 이야기하고 있습니다. – NoSenseEtAl

+0

제대로 처리 된 개체가 어설 션을 트리거하지 않도록 마무리 자에서 'if'문이 필요하다고 생각합니다. (나는 가비지 콜렉터가 여전히 스택 의미론을 통해 할당 된 객체를 처리한다고 생각한다.)'RAIIMonitor '또는 다른 값 유형을 시도하면 이상한 동작을 보일 수있다. 그 외에는 합리적인 것처럼 보입니다. –

+0

@ David check # 8 http://justlikeamagic.com/2010/04/29/9-rules-about-constructors-destructors-and-finalizers/ – NoSenseEtAl