2014-03-26 2 views
0

CCriticalSection 개체를 선언하는 클래스가 있습니다. 단순성을 위해 단 하나의 스레드가 한 번에 해당 클래스의 메소드를 입력하고 실행해야한다고 말합니다. 여기 내 질문은개체 수준 CSingleLock 대 메서드 수준 CSingleLock

,

는 거기에 클래스 수준 CSingleLock하고 잠금() 및 잠금 해제() 메소드의 날은 각 기능에 CSingleLock 객체를 선언 사용을 선언 내에서 차이.

class ExclusiveClass 
{ 
    CCriticalSection mCS; 
    ExclusiveClass() : mCS() {} 
    void someMethod 
    { 
     CSingleLock sl(&mCS); 
     sl.Lock() 
     // Do whatever you want 
     sl.Unlock(); 
    } 
} 

class ExclusiveClass 
{ 
    CCriticalSection mCS; 
    CSingleLock  mSL; 
    ExclusiveClass() : mCS(), mSL(&mCS) { } 
    void someMethod 
    { 
     mSL.Lock(); 
     // Do whatever you want 
     mSL.Unlock(); 
    } 
} 

나는 하나 개의 결정적인 차이를 알고있다. 두 번째 방법에서는 Unlock() 메서드를 명시 적으로 호출 할 필요가 없습니다. 함수에서 돌아 오면 sl의 소멸자가 호출되고 메소드 잠금이 자동으로 해제됩니다.

내 관심사는 wrt 예외입니다. 예외가 발생하면 두 번째 접근 방식이 자동으로 해제됩니다. 첫 번째 접근은 어떨까요? 그리고 다른 차이점이 있습니까?

답변

2

첫 번째 예는 예외가 아닙니다. Lock 이후에 무언가가 예외를 던지면 Unlock으로 전화하기 전에 결코 잠금을 해제하지 않습니다.

두 번째 예제에 표시되는 RAII 접근 방식을 사용해야합니다. 예외는 안전 할뿐만 아니라 Unlock 호출에 대해 걱정할 필요가 없으므로 쉽게 잊어 버리고 오류를 추적하기가 어려워집니다.

+0

감사합니다. 그것들은 유일한 차이점입니까? – Mohan

+0

@MohanKumar - 예 – Sean