2015-02-03 4 views
1

그것은 MSDN에서 잠금 및 잠금 CCriticalSection 개체에 언급되어 있습니다, 우리 CSingleLock 사용해야합니다. 그러나 CCriticalSection :: lock() 및 CCriticalSection :: unlock() 같은 일을, 안 그래? 그렇다면 두 방법의 차이점은 무엇입니까?Csinglelock은 무엇을 사용합니까?

+4

간단한 답변으로는 너무 큰 제목이지만 [예외 안전] (http://en.wikipedia.org/wiki/Exception_safety) 및 [RAII] (http://stackoverflow.com/)에 대해 알아야합니다. 질문/2321511). 뭔가가 '잠금'과 '잠금 해제'사이에 예외를 던지면 어떻게 될까요? 소멸자가 명시 적 함수 호출과 다른 점은 무엇입니까? –

답변

1

래퍼를 사용하면 잠금을 해제하는 지점에서 무엇을 하든지 (거의) 기능을 떠나면 잠금이 해제됩니다.

고려 :

void func() 
{ 
    lock(); 
    ... plenty of lines ... 
    // x = 8128 happens on a Wednesday, in a month without 
    // r in the name, only if the day is divisible by 7 and 3. 
    if (x == 8128) 
     return; 
    ... more lines of code ... 
    unlock(); 
} 

그래서, 한 번에 모든 이제 다시, 응용 프로그램이 잠금을 해제 잊는다. 당신이 래퍼를 사용하는 경우 등 예외를 사용 고토,

을받을 경우

같은

적용, 당신은 소멸자가 호출 될 것이라고 보장 할 때 래퍼 끝의 범위. 이것은 자물쇠 용 그대로 또는 std::vector과 마찬가지로 유용합니다.

예를 들어 longjmp을 사용하여 컨텍스트를 뛰어 넘으면 도움이되지 않습니다. 그렇다면 longjmp을 사용하면 안됩니다!

관련 문제