2009-11-17 3 views
6

아래의 두 코드 샘플은 동일합니까? 뮤텍스 및 잠금

Poco::ProcessHandle::PID ProcessRunner::processId() const 
{ 
    Poco::ProcessHandle::PID pid = 0; 
    mMutex.lock(); 
    pid = mPID; 
    mMutex.unlock(); 
    return pid; 
} 

, 두 번째 샘플에서

Poco::ProcessHandle::PID ProcessRunner::processId() const 
{ 
    Poco::ScopedLock<Poco::Mutex> lock(mMutex); 
    return mPID; 
} 
  • : 리턴 값의 복사본을 만든 후 잠금이 범위를 벗어나 갈 것인가? 복사에 대한 지침이 많은 객체가 반환 된 경우 중요합니다.
  • int 값만 반환하려는 경우 잠금이 필요합니까? 아니면 int를 원자 연산으로 복사하고 있는가?

답변

8

등가입니다. 지역 블록은 블록의 마지막 행이 실행될 때까지 범위를 벗어나지 않습니다. 따라서이 경우 리턴 값 복사는 잠금 장치 보호하에 수행됩니다.

3

Poco의 ScopedLock이 Boost의 lock_guard와 같이 작동하고 PID 할당이 예외를 throw 할 수없는 경우 첫 번째 질문에 대한 대답은 '예'입니다. 이 ScopedLock의 목적은 교착 상태를 막는 것입니다. 예외가 발생하는 경우에도 뮤텍스를 해제하는 것을 잊지 못할 수 있습니다. "일부 데이터 만 읽는"경우에도 잠금이 필요합니까? 글쎄,이 경우 (하나의 int에 접근하는 것)은 일종의 회색 영역 (더 좋지는 않음)이지만 일반적으로 데이터를 읽는다면 일반적으로 뮤텍스를 잠급니다.

+0

저는 작업의 원 자성에 대해 더 많이 우려하고 있습니다. 코드 샘플 2에서 가장 먼저 발생하는 것은 반환 값의 복사본 또는 잠금 제거입니다. 첫 번째 것이 아니라면 버그 코드입니다. – StackedCrooked

+0

내가 알 수있는 한, 반환 값은 "생성 된"후 모든 자동 객체가 파괴됩니다. – sellibitze

+0

방금 ​​함수가 지역 변수를 반환하면 변수를 파괴하기 전에 복사해야한다는 것을 알았습니다. 도. – StackedCrooked