2014-03-07 1 views
0

일부 컨퍼런스에서는이 내용이 표시되었지만 이에 대한 정보는 찾을 수 없습니다. 당신이 코드가 다수의 조기 반환과 매우 비 대한 얻는다 볼 수 있듯이범위/코드 블록이 포함 된 뮤텍스/잠금

lock(_somelock); 
if (_someBool) 
{ 
    unlock(_somelock); 
    return; 
} 

DoStuff(); 
unlock(_somelock); 

:

lock(_somelock) 
{ 
    if (_someBool) 
     return; 

    DoStuff(); 
} // Implicit unlock 

대신 :

내가 좋아하는 뭔가를 원한다. 물론 잠금/잠금 해제를 처리 할 수있는 또 다른 기능을 만들 수는 있지만 더 좋지는 않습니까?

C++ 11 표준 라이브러리에서 가능합니까?

+0

[이 참조] (http://en.cppreference.com/w/cpp/thread). –

답변

6

예, std::lock_guard을 사용하여 뮤텍스를 래핑 할 수 있습니다.

std::mutex m; 
int shared_data; 

// somewhere else 

void foo() 
{ 
    int x = compute_something(); 

    { 
     std::lock_guard<std::mutex> guard(m); 
     shared_data += x; 
    } 

    some_extra_work(); 
} 
3

표준 관용법은 평생 뮤텍스의 잠금 상태를 포함 가드 객체를 사용하는 것입니다. 같은

Class AutoLock 
{ 
    pthread_mutex_t *mpLockObj; 

    AutoLock(pthread_mutex_t& mpLockObj) 
    { 
     mpLockObj = &mpLockObj; 
     pthread_mutex_lock(mpLockObj); 
    } 

    ~AutoLock() 
    { 
    pthread_mutex_unlock(mpLockObj); 
    } 
}; 

사용 : 당신은 확인 할 수 있습니다

#define LOCK(obj) AutoLock LocObj(obj); 
int main() 
{ 

    pthread_mutex_t lock; 
    LOCK(lock); 

    return 0; 
} 
0

당신은 단순히 자신의 자동 잠금을 만들 수 있습니다

{ 
    std::lock_guard<std::mutex> lock(your_mutex); 

    if (_someBool) 
     return; 

    DoStuff(); 

} 
관련 문제